如何按示例规则查询并设置Row_Number字段?
解决同一项目下按年份分组生成连续序号的问题
嘿,我完全get到你的需求了——同一ProjectID分组里,相同RevisionYear的记录要对应同一个序号,年份递增时序号也跟着依次递增对吧?其实你要的不是ROW_NUMBER()函数,而是**DENSE_RANK()**,它完美适配这种“同值同序号、无跳号递增”的场景。
实现代码示例
直接用窗口函数就能搞定,SQL代码如下:
SELECT ProjectID, RevisionYear, DENSE_RANK() OVER (PARTITION BY ProjectID ORDER BY RevisionYear) AS Row_Number FROM YourTable; -- 把这里换成你的实际表名
代码解释
PARTITION BY ProjectID:按项目ID拆分数据,每个项目单独计算序号,不会和其他项目的序号混在一起ORDER BY RevisionYear:按年份升序排序,确保更早的年份对应更小的序号DENSE_RANK():和ROW_NUMBER()的核心区别是,它会给同一分组内相同RevisionYear的所有记录分配同一个序号,而且序号是连续递增的(不会因为有重复值就跳号)
验证结果
用你给出的测试数据跑这个SQL,输出结果正好是你想要的:
| ProjectID | RevisionYear | Row_Number |
|---|---|---|
| 1 | 2016 | 1 |
| 1 | 2017 | 2 |
| 1 | 2017 | 2 |
| 2 | 2019 | 1 |
| 2 | 2019 | 1 |
| 2 | 2020 | 2 |
如果你的数据库是MySQL 8.0+、SQL Server、PostgreSQL、Oracle这些主流版本,都原生支持DENSE_RANK()窗口函数,直接用就行~
内容的提问来源于stack exchange,提问作者TunaBone




