在MySQL中两次使用GROUP BY
我的桌子看起来像这样。
Location Head Id IntTime1 AMD 1 1
2 INTC 3 3
3 AMD 2 2
4 INTC 4 4
5 AMD2 1 0
6 ARMH 5 1
7 ARMH 5 0
8 ARMH 6 1
9 AAPL 7 0
10 AAPL 7 1
位置是主键。我需要GROUP BY Head和by Id,当我使用GROUP BY时,我需要保持IntTime最小的行。
在第一个GROUP BY ID之后,我应该得到(我保持最小的IntTime)
Location Head Id IntTime2 INTC 3 3
3 AMD 2 2
4 INTC 4 4
5 AMD2 1 0
7 ARMH 5 0
8 ARMH 6 1
9 AAPL 7 0
在第二个GROUP BY Head之后,我应该得到(我保持最小的IntTime)
Location Head Id IntTime2 INTC 3 3
3 AMD 2 2
5 AMD2 1 0
7 ARMH 5 0
9 AAPL 7 0
当我运行以下命令时,我将保留最小的IntTime,但行不会保留。
SELECT Location, Head, Id, MIN(IntTime) FROM test GROUP BY Id
另外,要运行第二个GROUP BY,我保存此表并再次执行
SELECT Location, Head, Id, MIN(IntTime) FROM test2 GROUP BY Head
有没有办法组合两个命令?
[编辑:说明]结果中不应包含两个具有相同值的Head或两个具有相同值的ID。删除这些重复项时,应保留IntTime最小的行。
回答:
此查询返回您要查找的确切最终结果(例如):
SELECT `final`.*FROM `tableName` AS `final`
JOIN (
SELECT `thead`.`Id`, `Head`, MIN(`intTime`) AS `min_intTime`
FROM `tableName` AS `thead`
JOIN (
SELECT `Id`, MIN(intTime) as min_intTime
FROM `tableName` AS `tid`
GROUP BY `Id`
) `tid`
ON `tid`.`Id` = `thead`.`Id`
AND `tid`.`min_intTime` = `thead`.`intTime`
GROUP BY `Head`
) `thead`
ON `thead`.`Head` = `final`.`Head`
AND `thead`.`min_intTime` = `final`.`intTime`
AND `thead`.`Id` = `final`.`Id`
回答:
最里面的查询按分组Id
,并返回Id
和MIN(intTime)
。然后,中间查询对by进行分组Head
,并返回Head
和Id
以及和MIN(intTime)
。缩小后,最终查询返回所有行。您可以将最终查询(最外面的查询)视为仅包含所需行的表查询,因此可以进行其他比较(例如WHEREfinal.intTime > 3
)。
以上是 在MySQL中两次使用GROUP BY 的全部内容, 来源链接: utcz.com/qa/408276.html