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