如何用SQL统计Snowflake中每个电话号码的唯一数字数量?
统计电话号码中的唯一数字数量
你当前使用的查询逻辑有误,LENGTH(phone_number) - LENGTH(REGEXP_REPLACE(phone_number, '[0-9]', '')) 实际是计算电话号码中数字的总个数,而非唯一数字的数量。比如对于号码9999999999,这个公式得到的结果是10,和你预期的1不符。
下面提供两种在Snowflake中实现需求的方法:
方法一:正则表达式去重后统计长度
利用正则匹配并移除重复出现的数字,再计算剩余字符串的长度:
SELECT phone_number, LENGTH(REGEXP_REPLACE(phone_number, '(.)(?=.*\\1)', '')) AS unique_digit_count FROM phone_numbers;
- 正则表达式
(.)(?=.*\\1)的作用是:匹配任意字符(这里是数字),且该字符在后续位置还会重复出现,将这类重复字符替换为空,最终剩下的就是所有唯一出现的数字。
方法二:拆分字符后去重计数
通过SPLIT_TO_TABLE将电话号码拆分为单个字符的行,再分组统计不同字符的数量:
SELECT phone_number, COUNT(DISTINCT value) AS unique_digit_count FROM phone_numbers, LATERAL SPLIT_TO_TABLE(phone_number, '') GROUP BY phone_number;
- 这种方法逻辑更直观,即使电话号码中包含非数字字符也能适配(不过你的场景中是纯数字号码,两种方法都适用)。
内容的提问来源于stack exchange,提问作者ice_cold
相关产品推荐
相关产品推荐

