Teradata — Как группировать данные в течение определенного периода времени

#sql #teradata

Вопрос:

У меня есть некоторые записи данных в Teradata, созданные системой транзакций в следующем формате:

 EVENT_ID      CUSTOMER      EVENT_CODE     EVENT_DATE       EVENT_TIME
123456        100           A01            24/09/2021       09:05:02
123457        100           Z99            24/09/2021       09:05:02
123458        100           A01            24/09/2021       09:05:02
123459        100           A01            24/09/2021       09:05:03
 

К сожалению, система иногда создает несколько записей для одной и той же транзакции. В приведенном выше примере была обработана 1 транзакция, но создано несколько записей о событиях «A01».

Я хочу выбрать минимальное значение EVENT_ID для «A01», сгруппированное по КЛИЕНТУ, КОДУ СОБЫТИЯ, ДАТЕ СОБЫТИЯ и где время события находится в пределах 5 секунд друг от друга.

Если я выполню следующее, он выведет идентификаторы событий 123456 и 123459, потому что последний отличается на 1 секунду. Я хочу, чтобы он выводил только 123456, хотя бы потому, что другие события «A01» происходят в течение 5 секунд.

 SELECT MIN(EVENT_ID),
       CUSTOMER,
       EVENT_DATE,
       EVENT_TIME
FROM MY_TABLE
WHERE EVENT_CODE = 'A01'
GROUP BY CUSTOMER,
         EVENT_DATE,
         EVENT_TIME
 

Комментарии:

1. в течение 5 секунд : Какой результат вы хотите получить 09:05:02 #1, 09:05:06 #2, 09:05:10 #3? Оба #2 и #3 находятся в пределах 5 секунд после предыдущего, но #3 находится через 8 секунд после #1.

Ответ №1:

Вы могли бы использовать порог с lag() . Я не уверен, какой порог вам нужен, но вот 5-секундный порог:

 select t.*
from my_table t
qualify event_time > lag(event_time) over (partition by customer, event_code, event_date order by event_time) - interval '5' second;
 
 

Комментарии:

1. Привет, я пробовал это, но, к сожалению, это выводит 100% записей. Я извлек каждое событие «A01» из таблицы, так как оригинал огромен, поэтому он работал довольно медленно. Моя новая структура таблицы такая же, как и в моем исходном сообщении, только без кода СОБЫТИЯ. На самом деле мы хотим, чтобы он группировался по 10-минутному порогу, поэтому мы запустили: select * from mytable qualify event_time < lead(event_time, 1, event_time interval '10' minute) over (partition by customer, event_date order by event_time) interval '10' minute в вашем коде был интервал 10 и 5 секунд-это была опечатка/значительная?

2. @markthornton90 … Я думаю, у меня была обратная логика. Вы хотите, чтобы события, в которых предыдущее событие имело какой-то заметный пробел, то есть смотрели назад, а не вперед.