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

2 番目の 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

また、2 番目の GROUP BY を実行するために、このテーブルを保存してもう一度実行します

SELECT Location, Head, Id, MIN(IntTime) FROM test2 
GROUP BY Head

両方のコマンドを組み合わせる方法はありますか?

[編集: 明確化] 結果には、同じ値を持つ 2 つの Head または同じ値を持つ 2 つの Id が含まれてはなりません。これらの重複を削除するときは、最小の IntTime を持つ行を保持する必要があります。

4

5 に答える 5

7

このクエリは、探している正確な最終結果を返します ( example ):

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)HeadHeadIdMIN(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 値を持つ行が必要です。2 番目の「グループごとのグループ」が何をもたらしているのかわかりません。

以下は、私があなたが望むと思うことを行います:

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

すべての「ヘッド」値に対して最小の 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

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 に答える
0

たとえば、サンプルの結果が ARMH の Location = 7 にどのように到達したかはわかりません。これを試して...

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