2012-02-15 14 views
2

私はデータを持つテーブル番号がある場合:SQL GROUP BYと集計

+------+------+------+------+ 
| colA | colB | colC | colD | 
+------+------+------+------+ 
| 1 | 2 | 3 | 4 | 
| 1 | 2 | 9 | 5 | 
+------+------+------+------+ 

をして実行します。

select colA, colB, colC, MAX(colD) FROM Numbers GROUP BY colA, colB; 

が、私はそれがcolA, colBによって行2.グループを返すべきであると信じているとピックcolDの中で最大のものです。あなたもそれを返すためにCOLCによってグループに持っているので、

残念ながら、これは、動作しません。

なぜですか?私がやろうとしていることをする別の方法がありますか?

colAcolBの行を同じにしたいが、最大のものはcolDです。

答えて

5

これを処理する方法はいくつかあります。おそらく最も簡単には、colA, colBグループを行いサブクエリに対してJOINであり、そこから完全対応する行を見つけます。

SELECT 
    tbl.colA, 
    tbl.colB, 
    tbl.colC, 
    tbl.colD 
FROM tbl JOIN (
    SELECT 
    colA, 
    colB, 
    MAX(colD) AS maxD 
    FROM tbl 
    GROUP BY colA, colB 
) g ON tbl.colA = g.colA AND tbl.colB = g.colB AND tbl.colD = g.maxD 
+0

これはNATURAL JOINの良いユースケースです。 – Benoit

+0

ありがとう、そして、あなたが質問をリファクタリングするためにBenoitに感謝します:)カラム名が両方で同じ場合、本当にすべてを "on"にする必要がありますか? – momomo

+0

@Hamidamはい、それらのうちの1つが主キーでない限り、それらはすべてON句にリストされている必要があります。例えば ​​'colA'がユニークなキー値であれば、' ON tbl.colA = g.colA'を行うことができますが、独自のものではないので、必要なだけ多くの列を組み合わせて一意の値 'colA 、colB、MAX(colD) ' –

0

クエリの問題の一つは、あなたがcodCの値を表示したいが、それは一部でグループではないということです。アグレギット機能なしで値を表示するには、グループ単位で行う必要があります。そのため、クエリを修正するために、あなたはこのような何かを行うことができます。

select n1.* from Number n1 
inner join (select colA, colB, max(colD) as colD from Number GROUP BY colA, colB) n2 on n1.colA = n2.colA and n1.colB = n2.colB and n1.colD = n2.colD 

それは各コーラCOLBの最大(コールド)とのすべての行を選択します。

+2

colDとして 'max(colD)'を別名にしないとうまくいかない! – Benoit

+0

@Benoitありがとう) –

3

あなたはこれを行うことができます:何の行は、あなたまし見つからない場合は

SELECT N1.colA, N1.colB, N1.colC, N1.colD 
    FROM Numbers N1 
    LEFT JOIN Numbers N2 ON N2.colA = N1.colA 
         AND N2.colB = N1.colB 
         AND N2.colD > N1.colD 
    WHERE N2.colA IS NULL; 

LEFTは、同じ列AとB、そしてより大きな列Dと同じテーブル内の行のルックアップします登録しようあなたは、これはだまされやすい人の行を返す場合DISTINCTを追加したい場合があります

SELECT * 
    FROM Numbers N 
WHERE NOT EXISTS 
    (SELECT NULL /* or whatever you want, doesn't matter */ 
     FROM Numbers 
     WHERE colA = N.colA 
      AND colB = N.colB 
      AND colD > N.colD 
    ) 

注:列D.

の最大値は、これは技術的には同じです。