一尘不染

在MySQL中两次使用GROUP BY

sql

我的桌子看起来像这样。

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最小的行。


阅读 735

收藏
2021-03-17

共1个答案

一尘不染

此查询返回您要查找的确切最终结果(例如):

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)。

2021-03-17