Redshift: разделение строки длительности на 24 часа - PullRequest
0 голосов
/ 16 февраля 2020

Я также пытаюсь разделить строку на диапазоны периода 24 часа между FromDate, Todate.

Например, если строка времени указана, как показано ниже (диапазон между FromDate , Todate - это 4 дня, поэтому я хочу 4 строки)

ID---FromDate---Todate     
1---2014-04-01 08:00:00.000---2014-04-04 12:00:00.000

Результат, который я хочу увидеть, будет таким:

ID---FromDate---Todate---DateDiff(HH)
1---2014-04-01 08:00:00.000---2014-04-01 23:59:59.000---15
1---2014-04-02 00:00:00.000---2014-04-02 23:59:59.000---23
1---2014-04-03 00:00:00.000---2014-04-03 23:59:59.000---23
1---2014-04-04 00:00:00.000---2014-04-04 12:00:00.000---12

Я нашел решение для этого , но он просто не работает с использованием Redshift, когда я выполняю итерацию внутри собственной вспомогательной таблицы (отличается от решения с использованием SQL Server!)

Я не уверен, возможно ли это используя Redshift или если я должен искать другой способ ее решения (например, пользовательскую функцию или что-то в этом роде).

Спасибо!

1 Ответ

0 голосов
/ 16 февраля 2020

Redshift имеет одну болезненную «особенность». Создавать производную таблицу очень сложно. Позвольте мне предположить, что у вас есть таблица, достаточно большая, чтобы сгенерировать таблицу подсчета или чисел.

Тогда, остальное - арифметика даты c. , , но немного сложнее. У меня нет Redshift под рукой - и у него странная комбинация синтаксиса даты с SQL Server и Postgres

with numbers as (
      select row_number() over () - 1 as n
      from t
     )
select t.id,
       greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate)  as fromdate,
       least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', t.todate) as todate
       datediff(hour,
                greatest(date_trunc('day', t.fromdate) + n.n * interval '1 day', t.fromdate),
                least(date_trunc('day', t.fromdate) + (n.n + 1) * interval '1 day', todate)
               ) as hours
from t join
     numbers n
     on todate > date_trunc('day', t.fromdate) + n.n * interval '1 day';

Здесь - это db <> скрипка используя Postgres, который иллюстрирует основные идеи, стоящие за этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...