为什么列必须出现在GROUP BY中?
Why column must appear in the GROUP BY?
我有这个:
SELECT name, value,
MIN(value) as find_min
FROM history
WHERE date_num >= 1609459200
AND date_num <= 1640995200
AND name IN('A')
GROUP BY name
尝试分别获取 每个 主题的日期之间的最小值:
name value
A. 3
B 4
C 9
A 0
C 2
我不断收到这个常见错误:
column "history.value" must appear in the GROUP BY clause or be used in an aggregate function
我读了这个must appear in the GROUP BY clause or be used in an aggregate function
我还是不明白:
- 为什么我必须将所有内容都包含在 GROUP BY 中?这是什么逻辑?
- 为什么这不起作用?
- 是
Min() over (partition by name)
更好,如果是这样,我怎样才能每个 name
只得到一个结果?
编辑:
如果我尝试:GROUP BY name, find_min
它也会失败,即使在这种情况下他可以产生唯一的结果(都一样)
试试下面的方法
SELECT name,
MIN(value) as find_min
FROM history
WHERE date_num >= 1609459200 AND date_num <= 1640995200
GROUP BY name
我删除了 ('A') 中的名称,因为您正在搜索所有名称的最小值,因此它只会限制 A
其实很好理解
当您输入 GROUP BY name
时,name
相同的所有行将组合在一起形成一个结果行。现在,原来的 table 可以包含具有相同 name
但不同 value
的两行。如果将 value
添加到 SELECT
列表中,应该输出哪些?另一方面,为每个组确定min(value)
是没有问题的。
即使整个组只有一个 value
(就像您的 find_min
),您也必须将该列添加到 GROUP BY
。
实际上有一个例外:如果 table 的主键在 GROUP BY
子句中,则 table 中的其他列不必在 GROUP BY
中, 因为这自动证明不能有不同的值。
为了回答您的问题,GROUP BY
将相似的数据分组在 table 中。
例如这个 table:
A B C
a d 1
a k 2
b d 3
你有以下查询:
SELECT A, B, MIN(C)
FROM t
GROUP BY A
这行不通您无法给出决定性的答案如何处理条目 a k 2
因为您不按列 B
分组,而是按列分组 A
,现在是否有两个条目,但它们是不同的。因此,您必须按所有非最小值、最大值、总和等进行分组。列。
我有这个:
SELECT name, value,
MIN(value) as find_min
FROM history
WHERE date_num >= 1609459200
AND date_num <= 1640995200
AND name IN('A')
GROUP BY name
尝试分别获取 每个 主题的日期之间的最小值:
name value
A. 3
B 4
C 9
A 0
C 2
我不断收到这个常见错误:
column "history.value" must appear in the GROUP BY clause or be used in an aggregate function
我读了这个must appear in the GROUP BY clause or be used in an aggregate function
我还是不明白:
- 为什么我必须将所有内容都包含在 GROUP BY 中?这是什么逻辑?
- 为什么这不起作用?
- 是
Min() over (partition by name)
更好,如果是这样,我怎样才能每个name
只得到一个结果?
编辑:
如果我尝试:GROUP BY name, find_min
它也会失败,即使在这种情况下他可以产生唯一的结果(都一样)
试试下面的方法
SELECT name,
MIN(value) as find_min
FROM history
WHERE date_num >= 1609459200 AND date_num <= 1640995200
GROUP BY name
我删除了 ('A') 中的名称,因为您正在搜索所有名称的最小值,因此它只会限制 A
其实很好理解
当您输入 GROUP BY name
时,name
相同的所有行将组合在一起形成一个结果行。现在,原来的 table 可以包含具有相同 name
但不同 value
的两行。如果将 value
添加到 SELECT
列表中,应该输出哪些?另一方面,为每个组确定min(value)
是没有问题的。
即使整个组只有一个 value
(就像您的 find_min
),您也必须将该列添加到 GROUP BY
。
实际上有一个例外:如果 table 的主键在 GROUP BY
子句中,则 table 中的其他列不必在 GROUP BY
中, 因为这自动证明不能有不同的值。
为了回答您的问题,GROUP BY
将相似的数据分组在 table 中。
例如这个 table:
A B C
a d 1
a k 2
b d 3
你有以下查询:
SELECT A, B, MIN(C)
FROM t
GROUP BY A
这行不通您无法给出决定性的答案如何处理条目 a k 2
因为您不按列 B
分组,而是按列分组 A
,现在是否有两个条目,但它们是不同的。因此,您必须按所有非最小值、最大值、总和等进行分组。列。