2016-09-14 11 views
0

私はSQL Serverグループによると、最大値

Table Data

として以下の画像では例えばのために、2つのうち1つのカラムがグループごとに最大値を持つ行を取得しようとしていますbox1、amnt1、amnt2で各ユニットに複数の行があることがわかります。

一度クエリが実行されると、ハイライトされた行が返され、ユニットのID(MAX(amnt1)、MAX(amnt2)の行のboxid)が返されます。したがって、ユニット10002の場合、最大のamnt1は1.60です。したがって、出力は

10002, 156, 1.60, 

誰かが私を助けてくれますか?私は、これはあなたがamnt1とamnt2で値を比較しようとしているイベントでは

おかげ

答えて

1

は、各列の最大値を算出し、全体的な行を見つけるためにその情報を使用する方法である:これは動作

select t.* 
from (select t.*, 
      max(amnt1) over (partition by unit) as max1, 
      max(amnt2) over (partition by unit) as max2 
     from t 
    ) t 
where (t.amnt1 = max1 and max1 >= max2) or 
     (t.amnt2 = max2 and max2 >= max1); 

方法は、それぞれのための2つの列ごとに最大値を計算することですunit。これらの最大値はmax1max2です。

where句は、言う:amnt1は本当に最高ですmax1max1と同じである場合は、この行を保管してください。同様に、amnt2max2と同じで、max2が実際に最大である場合は、行を維持します。

@ ZLKで与えられる解はより一般的です。より多くの列を持っていれば、ロジックはこのように説明するのがより複雑になります(実際はそれほど難しくありませんが、applyはもっとシンプルに見えます)。しかし、2列の場合、row_number()の前にネストされたapplyはちょっと複雑に見えます。

+0

あなたの親切な対応のための – user1063108

1

を成し遂げることができませんよ、ここにあなたがそれを行うことができる方法の例です:

DECLARE @myTable TABLE (unit INT, boxid INT, amnt1 DECIMAL(8, 4), amnt2 DECIMAL(8, 4)); 
INSERT @myTable VALUES 
     (10002, 2, 0.042, 1.53), (10002, 27, 1.25, null), (10002, 158, null, null), (10002, 63, 1.75, null) 
    , (10003, 156, 1.60, null), (10003, 2, 0.042, 1.53), (10003, 9, null, null), (10003, 19, 1.15, null) 
    , (10004, 9, null, null), (10004, 62, 2.000, 100) 
    , (10005, 69, 0.1, 6.9), (10005, 70, 0.2, 0.2), (10005, 71, 0.23, 0.69); 

SELECT unit, boxid, amnt1, amnt2 
FROM (
    SELECT unit, boxid, amnt1, amnt2, ROW_NUMBER() OVER (PARTITION BY unit ORDER BY Y DESC) R 
    FROM @myTable 
    CROSS APPLY (
     SELECT MAX(Y) 
     FROM (VALUES (amnt1), (amnt2)) X(Y)) Z(Y)) T 
WHERE R = 1; 

ここでは、amnt1とamnt2を比較し、その2つから最大値を取得します。次に、他の回答と同様に、行番号関数を使用して結果セットを並べ替えます(単位で分割)。ここ

+0

は..だからOPの代わりにROW_NUMBER()ZLKは、[OK]を、私はrealllllyあなたの答えの両方を認める – Matt

+0

感謝の絆(ゴードンとZLK)を望んでいるならば、あなたはまた、DENSE_RANK()またはRANK()を使用することができ、両方の作業に注意してください。私はちょうどゴードンのタイムライン上の最初のものを写真にします。 ゴードン氏はあなたの回答を説明することは可能でしょうか(ある種の人の言葉で言えば) ご返信いただきありがとうございます – user1063108

関連する問題