#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 … Я думаю, у меня была обратная логика. Вы хотите, чтобы события, в которых предыдущее событие имело какой-то заметный пробел, то есть смотрели назад, а не вперед.