当所有列都具有相同数据时,使用 Snowflake 中的 ROW_NUMBER 删除重复数据

问题描述 投票:0回答:2
项目_id 日历日期 有_播种 sow_activity_status sow_review_activity_actual_date
P1 2024-03-01 未完成
P1 2024-03-01 未完成
P1 2024-03-01 未完成
P1 2024-03-01 未完成
P1 2024-04-01 未完成
P1 2024-04-01 未完成
P1 2024-04-01 未完成
P1 2024-04-01 未完成
P2 2024-03-01 已完成 2023-12-20
P2 2024-03-01 已完成 2023-12-20
P2 2024-03-01 已完成 2023-12-20
P2 2024-03-01 已完成 2023-12-20
P2 2024-04-01 已完成 2023-12-20
P2 2024-04-01 已完成 2023-12-20
P2 2024-04-01 已完成 2023-12-20
P2 2024-04-01 已完成 2023-12-20

上表为源数据,最终预期输出为:

项目_id 日历日期 有_播种 sow_activity_status sow_review_activity_actual_date
P1 2024-03-01 未完成
P1 2024-04-01 未完成
P2 2024-03-01 已完成 2023-12-20
P2 2024-04-01 已完成 2023-12-20

可以使用不同的查询来实现预期的输出,即

select 
    distinct project_id, calendar_date, has_sow, sow_activity_status, sow_review_activity_actual_date
from source ;

希望使用 ROW_NUMBER 实现相同的效果,因为数据约为一百万条记录。 因此,将按project_id、calendar_date 对 ROW_NUMBER 窗口函数进行分区,但不知道应该按哪一列进行排序,因为所有剩余列将在project_id 和calendar_date 的粒度上具有相同的数据?

需要建议来确定 ROW_NUMBER 函数的 order by 子句。

sql duplicates snowflake-cloud-data-platform window-functions
2个回答
0
投票

您可以通过

ROW_NUMBER
ORDER BY
任意列(取
project_id
)来实现,如下所示:

select <all_Columns> from
(select t.*, 
        row_number() over (partition by <all_columns> order by project_id) as rn
  from your_table t) t
where rn = 1;
即使

row_number

 列具有相同的值,
order by
也始终会为分区记录提供唯一的行号。


0
投票

在这里使用

DISTINCT
对我来说似乎是正确的方法。我不建议使用
ROW_NUMBER
来删除重复项。作为替代方案,您可以使用
GROUP BY
:

SELECT project_id, calendar_date, has_sow, sow_activity_status, sow_review_activity_actual_date
FROM source
GROUP BY project_id, calendar_date, has_sow, sow_activity_status, sow_review_activity_actual_date;
© www.soinside.com 2019 - 2024. All rights reserved.