Snowflake中如何在SELECT查询里实现字符顺序不敏感的分组统计
实现方案
核心逻辑为:将待分组的字符串拆分为单个字符,对字符按字典序排序后重新拼接为新的字符串,使用该新字符串作为分组依据即可实现顺序不敏感的统计需求。Snowflake内置函数可直接实现该逻辑,无需额外自定义扩展。
方式1:原生SQL直接实现
针对你的示例场景,可运行如下查询得到预期结果:
WITH source_data AS ( -- 你的原始数据 SELECT column1 FROM (VALUES ('a'), ('b'), ('ab'), ('ba')) ), split_char AS ( -- 拆分每个字符串为单个字符 SELECT s.column1 AS original_str, c.value AS single_char FROM source_data s, TABLE(REGEXP_SPLIT_TO_TABLE(s.column1, '')) c ), sorted_key AS ( -- 对每个原始字符串的字符排序后拼接为分组键 SELECT original_str, LISTAGG(single_char, '') WITHIN GROUP (ORDER BY single_char) AS group_key FROM split_char GROUP BY original_str ) -- 按排序后的键分组统计,展示时取同组内最小的原始字符串作为分组名 SELECT MIN(original_str) AS COLUMN1, COUNT(*) AS "COUNT(*)" FROM sorted_key GROUP BY group_key ORDER BY COLUMN1;
方式2:封装为临时UDF简化多次调用
如果需要频繁使用该能力,可以先封装一个临时SQL函数,后续查询代码会更简洁:
-- 定义字符排序临时函数,会话关闭后自动失效无需额外清理 CREATE OR REPLACE TEMP FUNCTION sort_str_chars(input_str STRING) RETURNS STRING LANGUAGE SQL AS $$ SELECT LISTAGG(c.value, '') WITHIN GROUP (ORDER BY c.value) FROM TABLE(REGEXP_SPLIT_TO_TABLE(input_str, '')) c $$; -- 直接调用函数分组即可 SELECT MIN(column1) AS COLUMN1, COUNT(*) AS "COUNT(*)" FROM (VALUES ('a'), ('b'), ('ab'), ('ba')) GROUP BY sort_str_chars(column1) ORDER BY COLUMN1;
注意事项
- 如果需要同时忽略大小写分组,可以在拆分字符前统一用
UPPER()或LOWER()转换字符串大小写 - 如果字符串包含空格、特殊符号,上述逻辑也可正常处理,无需额外调整
内容的提问来源于stack exchange,提问作者Omer Shacham
相关产品推荐
相关产品推荐

