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  
Другие вопросы по тегам