redshift/postgresql - Как найти дубликаты, которые появляются в течение 1 секунды во время вставки?
У нас есть небольшая проблема, когда один из наших узлов регистрировал повторяющиеся события. Мы используем следующий запрос для вставки только уникальных событий, однако некоторые события были запущены в течение 1 секунды после предыдущего события, поэтому следующий запрос не будет перехватывать его, так как поле даты отличается.
Может ли кто-нибудь помочь мне обновить этот запрос, чтобы он захватывал только уникальные события, даже если разница составляет 1 секунду?
INSERT INTO project_events
SELECT * From (
SELECT
session,
date,
team,
project,
event_type,
event_group,
event_label,
event_value,
event_count,
ROW_NUMBER() OVER ( PARTITION BY
session,
date,
team,
project,
event_type,
event_group,
event_label,
event_value,
event_count
ORDER BY date, project ASC
) rownum
FROM tmp_table_name where record_type='update'
) WHERE rownum = 1;
1 ответ
Прежде всего, в вашем примере, поместив те же атрибуты в PARTITION BY
а также ORDER BY
не имеет смысла, так как значения внутри каждой группы будут идентичны, поэтому ваш запрос эквивалентен простому выполнению SELECT DISTINCT
на ваше PARTITION BY
атрибуты
Теперь к реальному вопросу. Как узнать, что элемент уникален? Это основано на комбинации всех этих атрибутов: session,team,project,event_type,event_group,event_label,event_value,event_count
?
Если так, попробуйте это:
SELECT * FROM
(
SELECT
session,
date,
team,
project,
event_type,
event_group,
event_label,
event_value,
event_count,
LAG(date) OVER (
PARTITION BY
session,
team,
project,
event_type,
event_group,
event_label,
event_value,
event_count
ORDER BY
date
) prev_date
FROM tmp_table_name where record_type='update'
) sub
WHERE prev_date IS NULL -- first event
OR DATEDIFF(second, prev_date, date) > 1 -- events more than 1 second apart