如何用SQL实现同组ROW_COUNT重复的Over Partition By反向效果
需求说明
我们日常使用ROW_NUMBER() OVER(PARTITION BY 分组字段 ORDER BY 排序字段)做行计数时,逻辑是同一分组内逐行递增,切换分组后计数重置为1。现在需要实现反向逻辑:同一分组内所有行的计数保持一致,切换新分组后计数再+1,最终效果如下:
NAME | ROW_COUNT A 1 A 1 A 1 B 2 C 3 C 3 D 4 E 5
实现方法
方法1:直接使用DENSE_RANK函数(最简单通用)
绝大多数支持窗口函数的SQL数据库(MySQL 8.0+/PostgreSQL/Oracle/SQL Server等)都可以直接用DENSE_RANK()窗口函数实现,直接按分组字段排序即可:
SELECT NAME, DENSE_RANK() OVER(ORDER BY NAME) AS ROW_COUNT FROM 你的业务表;
说明:
DENSE_RANK()的特性就是相同值的行排名完全一致,遇到不同的新值时排名+1,且排名连续无间隔,正好匹配需求。如果允许计数存在间隔,也可以替换为RANK()函数。
方法2:自定义分组排序规则的实现方案
如果你需要自定义分组的排序逻辑(比如按分组的首次出现时间、分组的业务优先级排序,而非按分组字段本身的自然顺序排序),可以先用子查询给每个分组分配唯一序号,再关联回原表:
-- 示例为按每个NAME分组的最早创建时间排序分配序号 WITH group_id AS ( SELECT NAME, ROW_NUMBER() OVER(ORDER BY MIN(create_time)) AS group_num FROM 你的业务表 GROUP BY NAME ) SELECT t.NAME, g.group_num AS ROW_COUNT FROM 你的业务表 t INNER JOIN group_id g ON t.NAME = g.NAME;
内容的提问来源于stack exchange,提问作者Coco jombo
相关产品推荐
相关产品推荐

