为什么Redshift要我在GROUP子句中包含所有非聚合列?

时间:2018-01-27 08:03:43

标签: amazon-redshift

在GROUP子句中放置所有非聚合列可能会产生不同的数据集。例如:

sample

+---+---+---+
| x | y | z |
+---+---+---+
| 5 | 3 | 1 |
| 6 | 2 | 1 |
+---+---+---+

SELECT sum(x),y,z FROM sample group by z导致:

+--------+---+---+
| sum(x) | y | z |
+--------+---+---+
|     11 | 3 | 1 |
+--------+---+---+

而, SELECT sum(x),y,z FROM sample group by y,z导致:

+--------+---+---+
| sum(x) | y | z |
+--------+---+---+
|      6 | 2 | 1 |
|      5 | 3 | 1 |
+--------+---+---+

为什么我需要在Redshift的GROUP子句中包含所有非聚合列?

P.S。 :在mySQL上运行示例查询。

1 个答案:

答案 0 :(得分:3)

查询

SELECT
    SUM(x),   -- sum all records by x in a z group
    y,        -- but what do you want to do here?
    z         -- select the z group
FROM sample
GROUP BY z

甚至不会在大多数SQL数据库上运行,我很惊讶它在Redshift上运行。这里的问题是您按z进行汇总,然后选择y。不清楚要为每组y记录选择哪个 z值。数据库解决此问题的方法是要求所选的每个列都出现在GROUP BY子句中,或者位于聚合函数中,例如MAXSUM。在这些假设下,select语句中每个条目返回的值是确定的。