如何在PostgreSQL中按指定货币顺序生成行号
解决自定义货币排序+生成行号的问题
你的问题核心是默认字母排序会让AUD排在IDR前面,所以需要自定义货币的排序优先级,再结合月份排序,最后生成连续的行号NO列。下面提供两种常用实现方式:
方法1:使用CASE语句指定排序优先级
适合所有支持CASE表达式的SQL数据库(如PostgreSQL、SQL Server、MySQL等):
SELECT ROW_NUMBER() OVER(ORDER BY sort_priority, CAST(LEFT(Month, 2) AS INT)) AS NO, Currency, Month -- 此处添加你的其他字段 FROM ( SELECT *, -- 给目标货币指定排序优先级,值越小越靠前 CASE Currency WHEN 'IDR' THEN 1 WHEN 'USD' THEN 2 WHEN 'SGD' THEN 3 WHEN 'AUD' THEN 4 ELSE 5 -- 未指定的货币自动排到最后 END AS sort_priority FROM your_table -- 替换为你的实际表名 ) t ORDER BY sort_priority, CAST(LEFT(Month, 2) AS INT);
关键说明:
- 内层查询通过
CASE给每个货币分配排序权重,确保IDR优先级最高 - 外层用
ROW_NUMBER()生成连续行号,排序规则和最终ORDER BY保持一致,保证行号顺序正确 - 月份排序时将
LEFT(Month,2)转为整数,避免字符串排序异常(比如"10个月"不会错误排在"2个月"前面)
方法2:使用MySQL的FIELD函数简化排序
如果你的数据库是MySQL,可以用FIELD函数直接指定排序顺序,代码更简洁:
SELECT ROW_NUMBER() OVER(ORDER BY FIELD(Currency, 'IDR', 'USD', 'SGD', 'AUD'), CAST(LEFT(Month, 2) AS UNSIGNED)) AS NO, Currency, Month -- 此处添加你的其他字段 FROM your_table -- 替换为你的实际表名 ORDER BY FIELD(Currency, 'IDR', 'USD', 'SGD', 'AUD'), CAST(LEFT(Month, 2) AS UNSIGNED);
关键说明:
FIELD(Currency, 'IDR', 'USD', 'SGD', 'AUD')会返回货币在列表中的位置(IDR返回1,USD返回2,以此类推),直接实现自定义排序- 行号生成和月份处理逻辑与方法1一致
内容的提问来源于stack exchange,提问作者nia a
相关产品推荐
相关产品推荐

