为什么列必须出现在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

我还是不明白:

  1. 为什么我必须将所有内容都包含在 GROUP BY 中?这是什么逻辑?
  2. 为什么这不起作用?
  3. 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,现在是否有两个条目,但它们是不同的。因此,您必须按所有非最小值、最大值、总和等进行分组。列。