SQL查询如何实现Row列按年份分组,同一年同分组行号一致
问题原因
你当前的SQL存在两点问题:
- 将
YEAR(o3.DocDate)加入了PARTITION BY,意味着同一年、相同CardCode、相同ItmsGrpNam的记录会被分到同一个独立计算分区 - 使用
ROW_NUMBER()窗口函数时,即便分区内所有记录排序值一致,也会生成不重复的递增编号,因此同一年的两条记录会得到1、2两个不同行号
调整方案
将YEAR(DocDate)从分区条件移动到排序条件,同时将ROW_NUMBER()替换为DENSE_RANK(),即可实现同一年份相同维度的记录行号一致、不同年份行号按时间递增的效果:
SELECT DENSE_RANK() OVER ( PARTITION BY o3.CardCode, o3.ItmsGrpNam ORDER BY YEAR(o3.DocDate) ) AS [Row], o3.DocDate, o3.CardCode, o3.ItmsGrpNam FROM OINV o3
效果验证
执行上述语句后,相同CardCode、ItmsGrpNam分组下:
- 2019年的所有对应记录行号均为1
- 2021年的所有对应记录行号均为2
和你预期的输出完全一致。
内容的提问来源于stack exchange,提问作者Vigna Hari Karthik
相关产品推荐
相关产品推荐

