根据多列和日期时间删除重复项

Posted

技术标签:

【中文标题】根据多列和日期时间删除重复项【英文标题】:Remove duplicates based on multiple columns and datetime 【发布时间】:2021-12-15 19:33:40 【问题描述】:

我想根据较早的日期时间删除具有相同 visitor_id 的重复行。例如,对于 visitor_id 2643331144,我想选择第 1 行,因为它具有较早的访问日期时间,并且还保留同一行的 channel 和 visit_page。对于visitor_id 1092581226,我想保留第3行。

rowno visitor_id datetime channel visit_page
1 2643331144 10/3/2021 4:05:29 PM email landing page
2 2643331144 10/3/2021 4:05:39 PM organic search landing page
3 1092581226 10/7/2021 1:08:12 PM email price reduced
4 1092581226 10/7/2021 1:08:44 PM organic search landing page
5 1092581226 10/7/2021 1:09:04 PM paid search unknow
6 1092581226 10/7/2021 1:09:05 PM email price reduced

我想要一个如下所示的结果:

rowno visitor_id datetime channel visit_page
1 2643331144 10/3/2021 4:05:29 PM email landing page
2 1092581226 10/7/2021 1:08:12 PM email price reduced

我使用了以下查询,但总访客人数被过度重复。但如果不使用分区,总数将被重复计算,因为同一访问者在同一会话期间有多个频道和页面。

with T as
(select *, row_number() over (partition by visitor_id order by datetime asc) as rank
from table A)

select distinct visitor_id, channel, visit_page
from T
where rank=1

【问题讨论】:

我注意到您几乎所有的问题都得到了回答,但没有一个答案被接受。接受有用的答案不仅是一种好习惯,而且可以减少重复并增加您的问题得到实际回答的机会。 感谢您的建议!我刚刚检查了我之前的所有问题并选择了有用的问题。 @Lion 你能多解释一下是什么问题吗?此查询未选择正确的行?还是什么? 或者显示一个你想要的结果的例子 @Felipe 我刚刚发布了我想要的结果,谢谢 【参考方案1】:

如果唯一的问题是最终输出中的 rownum,您可以在最终选择中使用 row_number() over (order by datetime asc) as rownum“重新计算”它:

with cte (
   visitor_id 
  ,datetime   
  ,channel    
  ,visit_page 
) as (
    values 
     (2643331144,'10/3/2021 4:05:29 PM','email','landing page'),
 (2643331144,'10/3/2021 4:05:39 PM','organic search','landing page'),
 (1092581226,'10/7/2021 1:08:12 PM','email','price reduced'),
 (1092581226,'10/7/2021 1:08:44 PM','organic search','landing page'),
 (1092581226,'10/7/2021 1:09:04 PM','paid search','unknow'),
 (1092581226,'10/7/2021 1:09:05 PM','email','price reduced')
)

select row_number() over (order by datetime asc) as rownum,
    visitor_id,
    datetime,
    channel,
    visit_page
from (
        -- inlined your WITH clause into subquery
        select *,
            row_number() over (
                partition by visitor_id
                order by datetime asc
            ) as rank
        from cte
    )
where rank = 1

输出:

rownum visitor_id datetime channel visit_page
1 2643331144 10/3/2021 4:05:29 PM email landing page
2 1092581226 10/7/2021 1:08:12 PM email price reduced

【讨论】:

以上是关于根据多列和日期时间删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

基于Javascript中的一列从多列中删除重复项

在python数据框中删除不包含列中特定字符串的多列的重复项

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项

如何按日期和 ID 删除 MySQL 表上的重复项? [复制]

如何在按唯一日期时间排序时删除重复项

在视图中删除具有 drupal 重复日期的重复项