Snowflake中GROUP BY返回错误计数问题咨询
问题描述
原始查询结果中仅存在唯一一行数据:
ID ACCOUNT_NUMBER DATE_1 DATE_2 123 347 2017-10-19 2017-10-29
执行以下GROUP BY统计语句:
SELECT DISTINCT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, COUNT(*) FROM TABLE GROUP BY 1, 2, 3, 4;
得到的结果中该行的COUNT(*)值为3,但预期应为1,请问异常原因是什么?
异常原因分析
出现这种情况最常见的原因有两种,结合Snowflake的特性,优先级从高到低:
原表实际存在3条完全重复的记录,你查看数据时用了去重逻辑
你看到的“唯一数据行”可能是通过SELECT DISTINCT语句,或者查询工具自带的去重显示功能得到的,但原表中其实有3条ID、ACCOUNT_NUMBER、DATE_1、DATE_2完全一致的记录。当执行GROUP BY时,这3条会被归为同一组,COUNT(*)自然返回3。日期字段存在隐性精度/时区差异,显示时被统一格式化
如果DATE_1或DATE_2实际是TIMESTAMP类型(而非纯DATE类型),Snowflake会存储到毫秒级精度,但默认查询展示时可能只显示年月日部分。比如3条记录的DATE_1分别是2017-10-19 00:00:00.000、2017-10-19 01:00:00.000、2017-10-19 02:00:00.000,但查询工具把它们格式化显示为2017-10-19,导致你误以为是同一行。不过这种情况只有当你在GROUP BY时对TIMESTAMP字段做了CAST转换为DATE才会归为同一组,如果直接按原始TIMESTAMP分组,会分成3组,每组COUNT(*)为1,所以这种情况概率低于第一种。
验证方法
- 执行
SELECT COUNT(*) FROM TABLE;,如果返回3,说明原表确实有3条重复记录; - 执行
SELECT ID, ACCOUNT_NUMBER, TO_CHAR(DATE_1, 'YYYY-MM-DD HH24:MI:SS.FF3'), TO_CHAR(DATE_2, 'YYYY-MM-DD HH24:MI:SS.FF3') FROM TABLE;,查看日期字段的完整精度值,确认是否存在隐性差异。
内容的提问来源于stack exchange,提问作者Kasra Pourang
相关产品推荐
相关产品推荐

