mysql - GROUP BY 按列聚合

标签 mysql sql h2

我遇到了一个问题,每次我尝试使用 GROUP BY 时,H2 都会通知我需要将某些列名添加到 GROUP BY 子句中因为根据我的研究,H2 不清楚如何对具有非重复数据的列进行排序。

这里有一个例子来详细说明:

人物表

+------------+------------+
| ID         | Name       |
+============+============+
| 1          | John       |
+------------+------------+
| 2          | Jane       |
+------------+------------+

宠物 table

+------------+------------+------------+------------+
| ID         | PERSON_ID  |    NAME    | BIRTHDATE  |
+============+============+============+============+
| 1          |      1     |  Rufus     |  2012      |
+------------+------------+------------+------------+
| 2          |      1     |  Ben       |  2014      | 
+------------+------------+------------+------------+

假设我想要属于 John 的所有最老的宠物。

SELECT PERSON.NAME, PET.NAME, PET.BIRTHDATE FROM PERSON
INNER JOIN PET ON PET.PERSON_ID = PERSON.ID
GROUP BY PERSON.NAME
ORDER BY PET.BIRTHDATE ASC

这在 MySQL 中可以完美地工作,因为它将简单地按 PERSON.NAME 分组,并且默认情况下,选择集合中的第一条记录。但是在H2中需要有MAX,MIN等聚合

如您在此示例中所见,问题在于您可以使用 MIN 来正确排序 BIRTHDATE,但似乎没有任何聚合函数可用于根据最旧的 BIRTHDATENAME 进行排序吗?

最佳答案

如果你想要最老的宠物,我会推荐:

SELECT p.NAME, pt.NAME, pt.BIRTHDATE
FROM PERSON p INNER JOIN
     PET pt
     ON pt.PERSON_ID = p.ID
WHERE pt.BIRTHDATE = (SELECT MIN(pt2.BIRTHDATE)
                      FROM pet pt2
                      WHERE  pt2.PERSON_ID = PT.PERSON_ID
                     );

这明确地选择了出生年份最早的一只或多只宠物(针对每个人)。无需聚合。

您也可以仅在 FROM 中使用 JOIN 来表达:

SELECT p.NAME, pt.NAME, pt.BIRTHDATE
FROM PERSON p INNER JOIN
     PET pt
     ON pt.PERSON_ID = p.ID JOIN
     (SELECT PERSON_ID, MIN(pt2.BIRTHDATE) as MINBT
      FROM pet pt2
      GROUP BY pt2.PERSON_ID
     ) pt2
     ON  pt2.PERSON_ID = PT.PERSON_ID;

关于mysql - GROUP BY 按列聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38810330/

相关文章:

java - 从 maven 但不是从 Intellij 执行时测试失败

mysql - SQL触发器更新同一个表

mysql - 优化 MySQL 中的查询 - 连接和子查询?

sql - 在没有字符串文字的有效 Oracle select 语句中,单词 `AS` 的最大比率是多少?

c++ - Qt SQL 准备失败

spring - 设置嵌入式 h2 数据库的端口号

mysql - 按有限数量的不同值进行选择

mysql - Rails - 按 datetime_local_field 搜索

php - 查询表单转SQL错误

java - H2 - 如何创建将行更改记录到另一个表的数据库触发器?