Intereting Posts
Требуется кол-во запросов Поставщик OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)» Ошибка SQL Turkish_CI_AS и SQL_Latin1_General_CP1_CI_AS ORDER BY ASC с нулями в нижней части Возможно ли получить доступ к старой версии строки в Postgres, которая не была очищена от вакуумирования? Arel: Левое внешнее соединение с использованием символов Выберите с двумя значениями для одного столбца Как я могу настроить Entity Framework для автоматической подстройки значений, полученных для определенных столбцов, сопоставленных полям char (N)? Использование шаблона в обновлении? mysql перекрывает две таблицы в метках времени Может ли сценарий для медианы быть обобщен и помещен в структуру типа функции Как регулярное выражение в sql-запросе Выберите из той же таблицы, что и вставка или обновление Интервью – обнаружение / удаление дубликатов записей И DataSource, и DataSourceID определены в «GridView1». Удалить одно определение

Разница во времени в часах и секундах над окном раздела в Teradata (Sessionizing Records)

Учитывая таблицу, подобную этой:

cust_id time 123 2015-01-01 12:15:05 123 2015-01-01 12:17:06 123 2015-01-02 13:15:08 123 2015-01-02 15:15:10 456 2015-01-01 10:15:05 456 2015-01-01 12:15:07 456 2015-01-01 14:11:10 

Я хотел бы рассчитать разницу во времени между каждой предшествующей записью (функция lag ) cust_id . Мой желаемый результат:

 cust_id time diff_hours diff_seconds 123 2015-01-01 12:15:05 NULL NULL 123 2015-01-01 12:17:06 0.00 121 123 2015-01-02 13:15:08 1.04 89882 123 2015-01-02 15:15:10 0.08 7202 456 2015-01-01 10:15:05 NULL NULL 456 2015-01-01 12:15:07 0.08 7202 456 2015-01-01 14:11:10 0.08 6963 

Как это сделать в Teradata?

Я пробовал такие вещи, как:

 SELECT * , (time - time) OVER (PARTITION BY cust_id ORDER BY time ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) FROM table_01 

Однако, пока NULL s появляется там, где это ожидалось, я получаю 0.0 для всех других результатов. Я также пытался использовать wrapping (time - time) с SUM и я попытался использовать EXTRACT(SECOND FROM TIME) и несколько других вариантов – например, пытаясь поместить DAY(4) to SECOND , но я не могу показаться получить синтаксис / упорядочение / преобразование совершенно правильно, особенно при бросании оконной функции в микс.

В Teradata нет LAG , но вы можете переписать его:

 SELECT t.* , (time) - min(time) OVER (PARTITION BY cust_id ORDER BY time ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) SECOND(4) FROM table_01 as t 

Когда вы пытаетесь получить секунды, вы получите ошибки «Интервал переполнения», т.е. более 9999 секунд. Либо перейдите в DAY(4) TO SECOND либо используйте этот SQL UDF. Я написал несколько лет назад для вычисления разницы двух временных меток за секунды:

 REPLACE FUNCTION TimeStamp_Diff_Seconds ( ts1 TIMESTAMP(6) ,ts2 TIMESTAMP(6) ) RETURNS DECIMAL(18,6) LANGUAGE SQL CONTAINS SQL RETURNS NULL ON NULL INPUT DETERMINISTIC SQL SECURITY DEFINER COLLATION INVOKER INLINE TYPE 1 RETURN (CAST((CAST(ts2 AS DATE)- CAST(ts1 AS DATE)) AS DECIMAL(18,6)) * 60*60*24) + ((EXTRACT( HOUR FROM ts2) - EXTRACT( HOUR FROM ts1)) * 60*60) + ((EXTRACT(MINUTE FROM ts2) - EXTRACT(MINUTE FROM ts1)) * 60) + (EXTRACT(SECOND FROM ts2) - EXTRACT(SECOND FROM ts1)) ;