14

我的桌子是这样的。

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

4

5 回答 5

7

此查询返回您正在寻找的确切最终结果(示例):

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)。然后,中间查询按 , 分组Head,并返回Head对应的Idand MIN(intTime)。最终查询在缩小范围后返回所有行。您可以将最终(最外层)查询视为仅包含您想要的行的表的查询,因此您可以进行额外的比较(例如WHERE final.intTime > 3)。

于 2012-06-21T20:04:39.657 回答
3
SELECT a.*
FROM test a
NATURAL JOIN
(
    SELECT c.Head, c.Id, MIN(c.IntTime) AS IntTime
    FROM test c
    NATURAL JOIN
    (
        SELECT Id, MIN(IntTime) AS IntTime
        FROM test
        GROUP BY Id
    ) d
    GROUP BY c.Head
) b
ORDER BY a.Location
于 2012-06-21T20:32:59.233 回答
1

如果我理解正确,您需要按 head 和 id 具有最小 int/time 值的行。我没有看到第二个“按头分组”给你带来了什么。

以下是我认为你想要的:

select t.*
from t join
     (select head, id, min(intTime) as min_intTime
      from t
      group by head, id
     ) tsum
     on tsum.head = t.head and
        tsum.id = t.id and
        tsum.min_intTime = t.intTime

您可能只需要所有“head”值的最小 intTime 。如果是这样,查询看起来像:

select t.*
from t join
     (select head, min(intTime) as min_intTime
      from t
      group by head
     ) tsum
     on tsum.head = t.head and
        tsum.min_intTime = t.intTime
于 2012-06-21T19:43:25.363 回答
0

例如,我不确定您的样本结果是如何到达 ARMH 的 Location = 7 的。试试这个...

SELECT MIN(Location), Head, Id, MIN(IntTime)
FROM test
GROUP BY Head, Id
于 2012-06-21T19:41:17.377 回答
0

使用 UNION 语法?

(SELECT Location, Head, Id, MIN(IntTime) FROM test 
GROUP BY Id)
UNION
(SELECT Location, Head, Id, MIN(IntTime) FROM test2 
GROUP BY Head)
于 2012-06-21T20:17:34.747 回答