我遇到了一个问题,每次我尝试使用 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
,但似乎没有任何聚合函数可用于根据最旧的 BIRTHDATE
对 NAME
进行排序吗?
最佳答案
如果你想要最老的宠物,我会推荐:
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/