如何为week和desc列的重复值分配相同的rownumber行号
解决分组重复行的相同行号分配问题
针对你提出的需求——当week和desc列的值组合重复时分配相同行号,我们可以利用SQL的窗口函数DENSE_RANK()来完美实现。
源数据表
| week | desc |
|---|---|
| 1 | ff |
| 1 | ss |
| 1 | ss |
| 2 | ff |
| 2 | ss |
| 4 | ff |
| 4 | ff |
| 4 | ss |
| 4 | ss |
实现SQL语句
SELECT week, `desc`, DENSE_RANK() OVER (PARTITION BY week ORDER BY `desc`) AS rownum FROM your_table_name;
语句细节解释
PARTITION BY week:按照week列进行分组,每个week组内单独计算行号,不同week组的行号会重新从1开始计数ORDER BYdesc``:在每个week组内,按照desc列的值排序,确保相同的desc值会被归为同一组,分配相同的行号DENSE_RANK():这个函数的核心特点是相同值会得到相同排名,且排名是连续的(不会像RANK()那样出现跳号),完全匹配你需要的“重复组合分配相同行号”的要求
执行后的期望结果
| week | desc | rownum |
|---|---|---|
| 1 | ff | 1 |
| 1 | ss | 2 |
| 1 | ss | 2 |
| 2 | ff | 1 |
| 2 | ss | 2 |
| 4 | ff | 1 |
| 4 | ff | 1 |
| 4 | ss | 2 |
| 4 | ss | 2 |
如果你的SQL方言不支持DENSE_RANK()(比如某些旧版本数据库),也可以用分组子查询结合ROW_NUMBER()的方式变通实现,但DENSE_RANK()无疑是最简洁高效的方案。
内容的提问来源于stack exchange,提问作者user2302158
相关产品推荐
相关产品推荐

