在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上运行示例查询。
答案 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
子句中,或者位于聚合函数中,例如MAX
或SUM
。在这些假设下,select语句中每个条目返回的值是确定的。