如何根据Month##字段生成月份升序枚举的rnk列?
实现按月数字升序添加排名列的方法
原始数据表
| Month | Month## | id |
|---|---|---|
| November | 11 | BC221 |
| July | 7 | 1232SAD |
| August | 8 | DSAGD323 |
| December | 12 | OKSDF93 |
| October | 10 | OPAFSD83 |
| September | 9 | POWER928 |
| August | 8 | DSAGD323 |
| December | 12 | DASF32 |
| October | 10 | HSKJFH73264 |
| September | 9 | 9812973HJKSDF |
预期结果表
| Month | Month## | id | rnk |
|---|---|---|---|
| November | 11 | BC221 | 5 |
| July | 7 | 1232SAD | 1 |
| August | 8 | DSAGD323 | 2 |
| December | 12 | OKSDF93 | 6 |
| October | 10 | OPAFSD83 | 4 |
| September | 9 | POWER928 | 3 |
| August | 8 | DSAGD323 | 2 |
| December | 12 | DASF32 | 6 |
| October | 10 | HSKJFH73264 | 4 |
| September | 9 | 9812973HJKSDF | 3 |
根据需求,要按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
相关产品推荐
相关产品推荐

