redshift/postgresql-如何查找插入过程中1秒内出现的重复项?

redshift/postgresql-如何查找插入过程中1秒内出现的重复项?,sql,amazon-redshift,Sql,Amazon Redshift,我们有一个问题,其中一个节点记录了重复的事件。我们使用下面的查询只插入唯一的事件,但是一些事件是在前一个事件发生后1秒内触发的,因此下面的查询不会捕获它,因为日期字段不同 是否有人可以帮助我更新此查询,使其仅捕获唯一事件,即使存在1秒差异 INSERT INTO project_events SELECT * From ( SELECT session, date, te

我们有一个问题,其中一个节点记录了重复的事件。我们使用下面的查询只插入唯一的事件,但是一些事件是在前一个事件发生后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;

首先,在您的示例中,将相同的属性放在
按分区
按顺序
中没有什么意义,因为每个组中的值都是相同的,因此您的查询相当于对
按分区
属性执行
选择不同的

现在,我们来谈谈真正的问题。您如何知道元素是唯一的?它是否基于所有这些属性的组合:
会话、团队、项目、事件类型、事件组、事件标签、事件值、事件计数

如果是,请尝试以下方法:

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  

日期列的数据类型是什么?时间戳,格式为“2016-03-01 00:00:00”
date\u trunc('minute',date)
这真是难以置信-它可以工作!先生,你刚刚把我的日子/星期/月都安排好了!!谢谢你!很乐意帮忙。考虑到我为红移公司的竞争对手工作,真是有趣:)