根据多列和日期时间删除重复项
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 | landing page | |
2 | 2643331144 | 10/3/2021 4:05:39 PM | organic search | landing page |
3 | 1092581226 | 10/7/2021 1:08:12 PM | 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 | price reduced |
我想要一个如下所示的结果:
rowno | visitor_id | datetime | channel | visit_page |
---|---|---|---|---|
1 | 2643331144 | 10/3/2021 4:05:29 PM | landing page | |
2 | 1092581226 | 10/7/2021 1:08:12 PM | 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 | landing page | |
2 | 1092581226 | 10/7/2021 1:08:12 PM | price reduced |
【讨论】:
以上是关于根据多列和日期时间删除重复项的主要内容,如果未能解决你的问题,请参考以下文章
在python数据框中删除不包含列中特定字符串的多列的重复项