我的桌子看起来像这样.
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最小的行.
此查询返回您要查找的确切最终结果(例如):
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
,并返回Id
和MIN(intTime)
。然后,中间查询对by进行分组Head
,并返回Head
和Id
以及和MIN(intTime)
。缩小后,最终查询返回所有行。您可以将最终查询(最外面的查询)视为仅包含所需行的表查询,因此可以进行其他比较(例如WHERE final.intTime > 3
)。