繁体   English   中英

GROUP BY 在 SnowFlake 中返回错误计数

[英]GROUP BY returns wrong count in SnowFlake

下面是 SnowFlake 查询中的一行。 这是结果中唯一包含此信息的行(即,此行是唯一的)。

ID   ACCOUNT_NUMBER  DATE_1       DATE_2
123  347             2017-10-19   2017-10-29

我运行了如下所示的 GROUP BY 来计算每个组中的行数。 上一行我得到了 3 个。 我不应该得到1吗?

SELECT DISTINCT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, COUNT(*) 
FROM TABLE GROUP BY 1, 2, 3, 4;
ID   ACCOUNT_NUMBER  DATE_1       DATE_2       COUNT
123  347             2017-10-19   2017-10-29   3

我希望看到这一行的计数为 1,但我得到了 3。

结果是正确的。 DISTINCT在分组之后应用,对提供的查询没有影响。

文档通常,SELECT 语句的子句按如下所示的顺序进行评估:

  1. 在哪里
  2. 通过...分组
  3. Window
  4. 合格
  5. 清楚的
  6. 订购方式
  7. 限制

以下两个查询产生相同的结果:

SELECT DISTINCT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, COUNT(*) 
FROM TAB
GROUP BY 1, 2, 3, 4;

SELECT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, COUNT(*) 
FROM TAB
GROUP BY 1, 2, 3, 4;

在此处输入图像描述

要应用 DISTINCT,应在分组(子查询)之前提供

SELECT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, COUNT(*) 
FROM (SELECT DISTINCT ID, ACCOUNT_NUMBER, DATE_1, DATE_2 FROM TAB)
GROUP BY 1, 2, 3, 4;

或者作为聚合 function 的一部分:

SELECT ID, ACCOUNT_NUMBER, DATE_1, DATE_2, 
       COUNT(DISTINCT ID, ACCOUNT_NUMBER, DATE_1, DATE_2) 
FROM TAB
GROUP BY 1, 2, 3, 4;

在此处输入图像描述

对于示例数据:

CREATE OR REPLACE TABLE TAB(ID INT,
                           ACCOUNT_NUMBER INT,
                           DATE_1 TEXT,
                           DATE_2 TEXT)
AS
SELECT 123,  347, '2017-10-19', '2017-10-29' UNION ALL 
SELECT 123,  347, '2017-10-19', '2017-10-29' UNION ALL 
SELECT 123,  347, '2017-10-19', '2017-10-29';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM