项目_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 子句。
您可以通过
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
也始终会为分区记录提供唯一的行号。
在这里使用
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;