如何在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;
说明:
- 递归CTE
split_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,会得到如下结果:
| number | sorted_number |
|---|---|
| 1010101010 | 0000011111 |
| 22442244 | 22224444 |
| 990012 | 001299 |
| 4579321 | 1234579 |
内容的提问来源于stack exchange,提问作者user20391531
相关产品推荐
相关产品推荐

