如何用RowNumber对SQL结果集分类?求可行实现方案
解决方案:按全局轮次分配RowNumber
看起来你想要的是根据条目出现的顺序,把同一“轮次”的条目归为同一个RowNumber——比如第一批包含ItemNumber1和2的首个条目,第二批包含它们的第二个条目加上ItemNumber3的首个条目,第三批是它们的第三个条目。之前用ROW_NUMBER() OVER (PARTITION BY ItemNumber ORDER BY (SELECT NULL))的方式只会给每个ItemNumber单独编号,自然达不到这个效果。
实现思路
这里的核心逻辑分为两步:
- 第一步:给每个
ItemNumber下的条目按出现顺序分配组内序号(标记这是该ItemNumber的第几个条目)。 - 第二步:计算到当前行为止全局的最大组内序号,这个最大值就是我们需要的
RowNumber——它代表当前条目所属的全局轮次。
完整SQL代码
WITH item_rn AS ( SELECT ItemNumber, Item, -- 给每个ItemNumber的条目分配组内序号 -- 注意:如果有实际的排序字段(如自增ID、创建时间),请替换(SELECT NULL)以保证顺序稳定 ROW_NUMBER() OVER (PARTITION BY ItemNumber ORDER BY (SELECT NULL)) AS rn FROM your_table ) SELECT ItemNumber, Item, -- 计算全局累计的最大组内序号,即为目标RowNumber MAX(rn) OVER (ORDER BY (SELECT NULL) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RowNumber FROM item_rn;
关键说明
ORDER BY (SELECT NULL):在部分数据库中,这个写法不保证固定的排序顺序。如果你的表有可以确定原始数据顺序的字段(比如自增主键、记录插入时间),一定要用这个字段替换(SELECT NULL),否则结果可能不符合预期。- 窗口函数
MAX(rn) OVER (...):通过ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW指定窗口范围为从第一行到当前行,这样就能动态计算到当前行为止的最大组内序号,完美匹配你需要的轮次分组逻辑。
内容的提问来源于stack exchange,提问作者Shoaib Maroof
相关产品推荐
相关产品推荐

