You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为SQL表按Category分组添加组内排序序号?

实现分组内排序序号的SQL方法

当然有办法!这是SQL里很常见的分组内排序需求,用窗口函数就能轻松搞定,几乎所有主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)都支持。

核心思路

使用ROW_NUMBER()窗口函数,通过PARTITION BY指定分组字段(这里是Category),再用ORDER BY定义分组内的排序规则(这里是DateForName降序),这样就能为每个分组内的行生成连续的序号。

完整SQL示例

假设你的表名为your_table,可以这样写:

SELECT 
    ID,
    CONCAT(Category, '|', ROW_NUMBER() OVER (PARTITION BY Category ORDER BY DateForName DESC)) AS Category_Rank
FROM your_table
ORDER BY DateForName DESC;

代码解释

  • ROW_NUMBER() OVER (...):窗口函数的核心,用来生成行号
  • PARTITION BY Category:按照Category字段分组,每个分组单独计算序号
  • ORDER BY DateForName DESC:在每个分组内,按照DateForName从新到旧排序,确保最新的日期对应序号1
  • CONCAT(...):把Category和生成的序号拼接成你想要的X|Y格式

执行结果

运行上面的SQL后,会得到你预期的结果:

ID  Category_Rank
1   100|1
2   101|1
3   100|2
4   101|2
5   100|3
6   103|1

补充说明

如果你的数据库版本比较旧(比如MySQL 5.x)不支持窗口函数,也可以用子查询的方式实现,但代码会复杂一些。不过现在主流数据库都已经支持窗口函数了,优先推荐上面的方法。

内容的提问来源于stack exchange,提问作者user6823971

火山引擎 最新活动