在MySQL中使用GROUP BY两次

You*_*cha 12 mysql 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
Run Code Online (Sandbox Code Playgroud)

位置是主键.我需要GROUP BY Head和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
Run Code Online (Sandbox Code Playgroud)

在第二个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
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令时,我保留最小的IntTime但不保留行.

SELECT Location, Head, Id, MIN(IntTime) FROM test 
GROUP BY Id
Run Code Online (Sandbox Code Playgroud)

另外,要运行第二个GROUP BY,我保存此表并再次执行

SELECT Location, Head, Id, MIN(IntTime) FROM test2 
GROUP BY Head
Run Code Online (Sandbox Code Playgroud)

有没有办法结合这两个命令?

[编辑:澄清]结果不应包含具有相同值的两个Head或具有相同值的两个Id.删除这些重复项时,应保留IntTime最小的行.

0b1*_*011 6

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

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`
Run Code Online (Sandbox Code Playgroud)

怎么运行的

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