如何为列中每个ID的每一次出现生成对应行号新列?
SQL 按ID分组统计出现次数解决方案
问题原因
你之前使用的ROW_NUMBER() OVER (ORDER BY [Id]) as rownum缺少分组配置,生成的是全表范围的全局行号,无法实现同ID维度的出现次数统计。
场景1:统计同ID的第N次出现(按顺序编号)
如果需要相同ID第一次出现标记为1、第二次为2,以此类推,使用带PARTITION BY的ROW_NUMBER开窗函数即可:
-- 若无需指定同ID内的排序规则,可直接使用以下写法 ROW_NUMBER() OVER (PARTITION BY [Id] ORDER BY (SELECT 1)) AS 出现次数 -- 若需要按特定规则排序(比如按创建时间先后统计出现顺序),替换ORDER BY后的字段即可 ROW_NUMBER() OVER (PARTITION BY [Id] ORDER BY create_time ASC) AS 出现次数
效果示例
原始数据:
| Id | 内容 |
|---|---|
| 1 | 测试1 |
| 2 | 测试2 |
| 1 | 测试3 |
| 1 | 测试4 |
| 2 | 测试5 |
输出结果:
| Id | 内容 | 出现次数 |
|---|---|---|
| 1 | 测试1 | 1 |
| 1 | 测试3 | 2 |
| 1 | 测试4 | 3 |
| 2 | 测试2 | 1 |
| 2 | 测试5 | 2 |
场景2:统计同ID的总出现次数(所有同ID行显示相同总数值)
如果需要每行都展示对应ID的总出现次数,使用COUNT开窗函数:
COUNT(*) OVER (PARTITION BY [Id]) AS ID总出现次数
效果示例
输出结果:
| Id | 内容 | ID总出现次数 |
|---|---|---|
| 1 | 测试1 | 3 |
| 1 | 测试3 | 3 |
| 1 | 测试4 | 3 |
| 2 | 测试2 | 2 |
| 2 | 测试5 | 2 |
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

