如何基于code和date字段创建显示自定义排序的字段?
按分组生成日期倒序排序序号的实现方案
需求示例
以下是目标效果的示例表格:
| code | date | order column |
|---|---|---|
| 1 | 10/04/22 | 3 |
| 1 | 11/04/22 | 2 |
| 1 | 14/05/22 | 1 |
| 2 | 10/04/22 | 2 |
| 2 | 15/04/22 | 1 |
| 3 | 11/04/22 | 1 |
| 4 | 12/04/22 | 2 |
| 4 | 16/04/22 | 1 |
| 5 | 15/04/22 | 2 |
| 5 | 17/04/22 | 1 |
不同数据库的实现代码
MySQL/MariaDB
使用窗口函数ROW_NUMBER(),按code分组、日期倒序生成序号:
SELECT code, date, ROW_NUMBER() OVER (PARTITION BY code ORDER BY STR_TO_DATE(date, '%d/%m/%y') DESC) AS `order column` FROM your_table;
如果你的date字段本身就是日期类型,不需要转换,直接写ORDER BY date DESC即可。
PostgreSQL
同样用窗口函数,日期转换用TO_DATE:
SELECT code, date, ROW_NUMBER() OVER (PARTITION BY code ORDER BY TO_DATE(date, 'DD/MM/YY') DESC) AS "order column" FROM your_table;
date为日期类型时,简化为ORDER BY date DESC。
SQL Server
用CONVERT处理日期格式,配合窗口函数实现:
SELECT code, date, ROW_NUMBER() OVER (PARTITION BY code ORDER BY CONVERT(DATE, date, 3) DESC) AS [order column] FROM your_table;
参数3对应DD/MM/YY格式,date是日期类型时直接用ORDER BY date DESC。
补充说明
PARTITION BY code:指定按code字段分组,每个组内独立计算序号ORDER BY date DESC:组内按日期从新到旧排序,最新日期对应序号1- 如果需要相同日期的记录共用同一个序号,可以把
ROW_NUMBER()换成RANK()或DENSE_RANK(),两者的区别是RANK()会跳过重复序号,DENSE_RANK()不会。
内容的提问来源于stack exchange,提问作者Country girl
相关产品推荐
相关产品推荐

