如何为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从新到旧排序,确保最新的日期对应序号1CONCAT(...):把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




