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

如何在Redshift表中对单行内的数字进行升序排序?

Redshift单行数字字符串升序排序方法

可以通过递归CTE+字符串拆分+排序聚合的方式实现,以下是具体方案:

方法1:递归CTE拆分字符并排序

假设你的表名为num_table,存储数字的字段名为number(若字段为数值类型,需先转换为字符串类型),可执行以下SQL:

WITH RECURSIVE split_chars AS (
    SELECT 
        number,
        1 AS pos,
        SUBSTRING(number, 1, 1) AS char
    FROM num_table
    UNION ALL
    SELECT 
        number,
        pos + 1,
        SUBSTRING(number, pos + 1, 1)
    FROM split_chars
    WHERE pos < LENGTH(number)
),
sorted_chars AS (
    SELECT 
        number,
        LISTAGG(char, '') WITHIN GROUP (ORDER BY char) AS sorted_number
    FROM split_chars
    GROUP BY number
)
SELECT * FROM sorted_chars;

说明:

  • 递归CTEsplit_chars将每个数字字符串拆分为单个字符,同时记录字符位置;
  • sorted_chars通过LISTAGG函数将拆分后的字符按升序排序后重新拼接;
  • 若原字段是数值类型,需替换为CAST(number AS VARCHAR)来转换为字符串。

方法2:生成序列替代递归(适合有长度上限的字符串)

如果你的数字字符串长度有明确上限(比如最多10位),可以用GENERATE_SERIES生成位置序列拆分字符:

-- 先开启生成序列功能(若未开启)
SET enable_generate_series TO true;

WITH pos_series AS (
    SELECT GENERATE_SERIES(1, 10) AS pos -- 10为字符串最大长度,按需调整
),
split_chars AS (
    SELECT 
        t.number,
        SUBSTRING(t.number, s.pos, 1) AS char
    FROM num_table t
    CROSS JOIN pos_series s
    WHERE s.pos <= LENGTH(t.number)
),
sorted_chars AS (
    SELECT 
        number,
        LISTAGG(char, '') WITHIN GROUP (ORDER BY char) AS sorted_number
    FROM split_chars
    GROUP BY number
)
SELECT * FROM sorted_chars;

注意事项:

  • Redshift默认可能关闭GENERATE_SERIES功能,需先执行开启命令;
  • 若字符串长度不固定,可先查询表中字符串的最大长度,再调整GENERATE_SERIES的上限值。

测试验证

用你提供的测试数据执行上述SQL,会得到如下结果:

numbersorted_number
10101010100000011111
2244224422224444
990012001299
45793211234579

内容的提问来源于stack exchange,提问作者user20391531

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:52:46