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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:55:13