如何调整SQL的row_number()函数以去除重复记录并保留目标顶行?
问题与解决方案
现有数据记录
| key | start_dt | end_dt | id | status |
|---|---|---|---|---|
| 12 | 2020-8-12 | 2300-01-01 | 1 | active |
| 12 | 1998-9-23 | 2014-9-23 | 2 | active |
当前使用的函数
row_number() over (partition by id order by status, end_dt desc) rnk
目标结果
| key | start_dt | end_dt | id | status |
|---|---|---|---|---|
| 12 | 2020-8-12 | 2300-01-01 | 1 | active |
调整方案
将函数的分区字段从id改为key,调整后的函数为:
row_number() over (partition by key order by status, end_dt desc) rnk
之后在外层查询中添加过滤条件where rnk = 1,即可得到目标记录。
原因说明
原函数按id分区,两条数据会被分到不同分区,各自生成rnk=1,无法筛选出唯一结果。改为按key分区后,两条数据进入同一分区,按end_dt降序排序后,end_dt最大的记录会被标记为rnk=1,过滤后就能得到你需要的目标记录。
内容的提问来源于stack exchange,提问作者Ana Ho
相关产品推荐
相关产品推荐

