如何按Type(A→B→C→D→E)及Last Submit倒序排序SQL数据
如何编写SQL实现指定排序逻辑?
原始数据
| Customer ID | Name | Type | Last Submit |
|---|---|---|---|
| 1 | Patricio | C | January 2022 |
| 2 | Dale | A | June 2022 |
| 3 | Yvonne | C | July 2022 |
| 4 | Pawe | C | June 2022 |
| 5 | Sergio | B | August 2022 |
| 6 | Roland | C | August 2022 |
| 7 | Georg | D | November 2022 |
| 8 | Catherine | D | October 2022 |
| 9 | Pascale | E | October 2022 |
| 10 | Irene | A | November 2022 |
需求
先按Type字段以A、B、C、D、E的固定顺序排序,同Type内按Last Submit字段倒序(最新提交在前)排列,最终结果如下:
目标结果
| Customer ID | Name | Type | Last Submit |
|---|---|---|---|
| 10 | Irene | A | November 2022 |
| 2 | Dale | A | June 2022 |
| 5 | Sergio | B | August 2022 |
| 6 | Roland | C | August 2022 |
| 3 | Yvonne | C | July 2022 |
| 4 | Pawe | C | June 2022 |
| 1 | Patricio | C | January 2022 |
| 7 | Georg | D | November 2022 |
| 8 | Catherine | D | October 2022 |
| 9 | Pascale | E | October 2022 |
SQL解决方案
方法一:使用FIELD()函数(适用于MySQL/MariaDB)
SELECT `Customer ID`, Name, Type, `Last Submit` FROM your_table_name ORDER BY FIELD(Type, 'A', 'B', 'C', 'D', 'E'), STR_TO_DATE(`Last Submit`, '%M %Y') DESC;
方法二:使用CASE表达式(通用SQL,适配多数数据库)
SELECT "Customer ID", Name, Type, "Last Submit" FROM your_table_name ORDER BY CASE Type WHEN 'A' THEN 1 WHEN 'B' THEN 2 WHEN 'C' THEN 3 WHEN 'D' THEN 4 WHEN 'E' THEN 5 ELSE 6 -- 处理不在A-E范围内的类型,放在最后 END, TO_DATE("Last Submit", 'Month YYYY') DESC;
逻辑说明
- 按Type固定顺序排序:
FIELD()函数直接指定Type的排序优先级,匹配到的顺序对应1、2、3、4、5,未匹配的类型会排在最后。CASE表达式通过将Type映射为数字实现固定顺序,确保A到E依次排列。
- 同Type内按Last Submit倒序:
- 先将
Last Submit的字符串格式(如"November 2022")转换为日期类型,再按降序排列,保证最新提交日期在前。不同数据库的日期转换函数略有差异:- MySQL/MariaDB用
STR_TO_DATE() - PostgreSQL用
TO_DATE() - SQL Server用
CONVERT(DATE, "Last Submit", 109)
- MySQL/MariaDB用
- 先将
内容的提问来源于stack exchange,提问作者dimas tatag anditya
相关产品推荐
相关产品推荐

