You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:12:04