在MySQL中两次使用GROUP BY

我的桌子看起来像这样。

Location    Head    Id  IntTime

1 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  IntTime

2 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  IntTime

2 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,并返回IdMIN(intTime)。然后,中间查询对by进行分组Head,并返回HeadId以及和MIN(intTime)。缩小后,最终查询返回所有行。您可以将最终查询(最外面的查询)视为仅包含所需行的表查询,因此可以进行其他比较(例如WHEREfinal.intTime > 3)。

以上是 在MySQL中两次使用GROUP BY 的全部内容, 来源链接: utcz.com/qa/408276.html

回到顶部