使用DENSE_RANK()时同日期排序导致排名异常的技术问询
解决DENSE_RANK对同日期不同来源记录的排名问题
你的问题出在排序条件仅依赖ISNULL([PAYROLL DATE], [PROCESS DATE]),导致所有处理后日期一致的记录(无论原日期来自PAYROLL DATE还是PROCESS DATE)被归为同一排名。要实现期望的排名结果,需要在ORDER BY中增加日期来源的区分规则,让PAYROLL DATE非空的记录优先于PROCESS DATE补位的记录排序,同时保留同来源同日期的记录排名一致。
修改后的查询语句
DENSE_RANK() OVER (PARTITION BY [Plan ID], [EE ID], [Loan Number] ORDER BY ISNULL([PAYROLL DATE], [PROCESS DATE]) ASC, CASE WHEN [PAYROLL DATE] IS NOT NULL THEN 1 ELSE 2 END ASC)
逻辑说明
- 第一排序条件保持你原本的日期处理逻辑,确保整体日期顺序正确
- 第二排序条件通过
CASE语句标记日期来源:- 若
PAYROLL DATE不为空,标记为1 - 否则标记为2
这会让同处理日期下,PAYROLL DATE的记录排在PROCESS DATE的记录之前
- 若
DENSE_RANK()会根据这两级排序规则生成排名,既保证同PAYROLL DATE的记录排名一致,又让PROCESS DATE补位的记录获得更高的独立排名
验证结果
| [Plan ID] | [EE ID] | [Loan Num] | [PAYROLL DATE] | [PROCESS DATE] | (期望)排名 | (修改后)排名 |
|---|---|---|---|---|---|---|
| ABC123 | 1234 | 1 | 11/26/2021 | NULL | 1 | 1 |
| ABC123 | 1234 | 1 | 12/23/2021 | NULL | 2 | 2 |
| ABC123 | 1234 | 1 | 02/18/2022 | NULL | 3 | 3 |
| ABC123 | 1234 | 1 | 02/18/2022 | NULL | 3 | 3 |
| ABC123 | 1234 | 1 | NULL | 02/18/2022 | 4 | 4 |
内容的提问来源于stack exchange,提问作者JMGJ
相关产品推荐
相关产品推荐

