2017-03-28 1 views
2

私たちのノードの1つが重複イベントをログに記録するという問題があります。一意のイベントのみを挿入するには、次のクエリを使用しますが、イベントの一部は前のイベントの1秒後に発生したため、日付フィールドが異なるため、次のクエリではそれをキャッチしません。redshift/postgresql - 挿入中に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; 
+0

日付列のデータ型とは何ですか? –

+0

タイムスタンプ、 "2016-03-01 00:00:00" – Joe

+0

'date_trunc( 'minute'、date)' –

答えて

0

まず第一に、あなたの例では、PARTITION BYORDER BYで同じ属性を置くこと、ほとんど意味がないので、あなたのクエリは、単にあなたのPARTITION BY属性にSELECT DISTINCTを行うことと等価です

今、本当の質問です。要素が一意であることをどのように知ることができますか?それはこれらすべての属性のコンボに基づいていますか: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 
+0

これは信じられません。あなたは私の日/週/月をちょうど作りました!ありがとうございました! – Joe

+0

お寄せいただきありがとうございます。私はRedshiftの競争相手のために働くことを考えると面白い:) –

関連する問題