如何在Synapse中使用DENSE_RANK()添加递增排名列
解决方案:基于Title生成排序排名(Synapse环境)
核心逻辑
要实现按Title分组,同时依据EventNo和ProgramDate的顺序生成排名,需借助窗口函数RANK()或DENSE_RANK(),搭配PARTITION BY(分组)和ORDER BY(排序)子句:
PARTITION BY Title:将数据按节目标题拆分,每个标题单独计算排名ORDER BY EventNo, ProgramDate:在每个标题分组内,按事件编号、节目日期的顺序确定排名先后
完整查询语句
根据你需要的排名规则,提供两种常用写法:
1. 连续排名(DENSE_RANK())
当分组内存在相同排序键时,排名不会跳过序号,始终连续递增:
SELECT EventNo, ProgramDate, Title, -- 可添加其他需要查询的字段 DENSE_RANK() OVER (PARTITION BY Title ORDER BY EventNo, ProgramDate) AS TitleRank FROM [Prod].[Schedule] ORDER BY EventNo, ProgramDate;
2. 非连续排名(RANK())
当分组内存在相同排序键时,相同数据会获得同一排名,后续排名会跳过对应序号:
SELECT EventNo, ProgramDate, Title, -- 可添加其他需要查询的字段 RANK() OVER (PARTITION BY Title ORDER BY EventNo, ProgramDate) AS TitleRank FROM [Prod].[Schedule] ORDER BY EventNo, ProgramDate;
示例验证
假设你的示例数据如下:
| EventNo | ProgramDate | Title |
|---|---|---|
| 1 | 2024-05-20 | 新闻早报 |
| 2 | 2024-05-20 | 财经速递 |
| 3 | 2024-05-20 | 新闻早报 |
| 4 | 2024-05-20 | 新闻早报 |
| 5 | 2024-05-20 | 财经速递 |
使用DENSE_RANK()的输出结果:
| EventNo | ProgramDate | Title | TitleRank |
|---|---|---|---|
| 1 | 2024-05-20 | 新闻早报 | 1 |
| 2 | 2024-05-20 | 财经速递 | 1 |
| 3 | 2024-05-20 | 新闻早报 | 2 |
| 4 | 2024-05-20 | 新闻早报 | 3 |
| 5 | 2024-05-20 | 财经速递 | 2 |
特殊场景适配
如果你的预期效果是全局按Title出现顺序排名(而非分组内排名),可去掉PARTITION BY Title,直接基于全局排序生成排名:
SELECT EventNo, ProgramDate, Title, DENSE_RANK() OVER (ORDER BY Title, EventNo, ProgramDate) AS GlobalTitleRank FROM [Prod].[Schedule] ORDER BY EventNo, ProgramDate;
内容的提问来源于stack exchange,提问作者Vivek KB
相关产品推荐
相关产品推荐

