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

如何根据Month##字段生成月份升序枚举的rnk列?

实现按月数字升序添加排名列的方法

原始数据表

MonthMonth##id
November11BC221
July71232SAD
August8DSAGD323
December12OKSDF93
October10OPAFSD83
September9POWER928
August8DSAGD323
December12DASF32
October10HSKJFH73264
September99812973HJKSDF

预期结果表

MonthMonth##idrnk
November11BC2215
July71232SAD1
August8DSAGD3232
December12OKSDF936
October10OPAFSD834
September9POWER9283
August8DSAGD3232
December12DASF326
October10HSKJFH732644
September99812973HJKSDF3

根据需求,要按Month##的升序为每个月份分配连续排名(相同Month##的行排名一致),以下是几种主流数据库的实现方式:

支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、BigQuery等)

直接使用DENSE_RANK()窗口函数,按Month##升序计算排名:

SELECT 
    Month,
    Month##,
    id,
    DENSE_RANK() OVER (ORDER BY Month## ASC) AS rnk
FROM 
    your_table_name;

由于你的Month##值都是唯一排序项,用RANK()也能得到相同结果,但DENSE_RANK()更通用——后续如果出现相同Month##的并列场景,它能保证排名连续。

MySQL 5.x(不支持窗口函数)

可以通过子查询统计当前Month##的更小值数量,再加1得到排名:

SELECT 
    t1.Month,
    t1.Month##,
    t1.id,
    (SELECT COUNT(DISTINCT t2.Month##) FROM your_table_name t2 WHERE t2.Month## < t1.Month##) + 1 AS rnk
FROM 
    your_table_name t1;

也可以用JOIN方式提升查询效率:

SELECT 
    t1.Month,
    t1.Month##,
    t1.id,
    COUNT(DISTINCT t2.Month##) + 1 AS rnk
FROM 
    your_table_name t1
LEFT JOIN 
    your_table_name t2 ON t2.Month## < t1.Month##
GROUP BY 
    t1.Month, t1.Month##, t1.id;

执行以上任意语句,都能得到你预期的排名结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:20:22