2012-04-25 10 views
1

可能性の重複:
Selecting the Highest Seq Number by nested JoiningSQL表シーケンス番号が最大

私は、クエリを記述する必要がありますこんにちは、私は(各クライアントIDの大きなシーケンス番号を最大のシーケンス番号を利用したいと思います銀行口座残高の最高額に基づいて計算されます)。

この表には100000レコードがあると考えてください。

表は

below-として表のようなものです:

 
**ClID**  **SeqNu**  **Bal** 
1     1    30000 
1     2    26789 
1     3    23456 
1     4    12345 
1     5    21234 
2     3    12456 
2     4    45632 
2     1    23456 
2     9    99999 
3     4    12345 
3     5    21234 
3     3    12456 
3     4    45632 

結果は、あなたがGROUP BYを使用する必要が

 
**ClID**  **SeqNu**   **Bal** 
1     1    30000 
2     9    99999 
3     4    45632 
+0

これは私の編集だったかもしれない...しかし、私はあなたがいると思うが、右 – cjk

+1

ですね'SeqNu'ではなく、最も高い' Bal'を望むように - あなたの質問のタイトルは正しいのですか? – RedFilter

+0

RedFileter、私はクライアントのために最も高い番号が必要です(そのクライアントIDとの最高残高に基づいて) –

答えて

2

これを実現する最良の方法は、おそらくあなたが使用しているRDBMSいるによって異なります。あなたはウィンドウ関数(インスタンスのOracle 9iの+またはSQL Server 2012、)持っている場合は、次のように動作するはずです:

select distinct ClId, 
       first_value(SeqNu) 
        over (partition by ClId 
          order by Bal desc) as SeqNu, 
       max(Bal) 
        over (partition by ClId) as Bal 
from your_table 
+0

@アラン - 見て、合理的な何か、私はこれを試してみましょう。 –

+0

@Allen、Hhaはい、私は2008r2に取り組んでいるので、上記のクエリを使用することはできません。しかし、あなたのクエリロジックに応じて私は私の要求に達するかもしれません。私の問題を解決する他の方法はありますか?ありがとうございました。 –

+0

ウィンドウ機能を使用できない場合は、@ RedFilterの答えが最良の方法です。問題が解決された場合は、必ず答えとして選択してください。 – Allan

2

次のようになります。

SELECT SeqNu, MAX(Bal) 
FROM Table 
GROUP BY SeqNu 
+0

これは完全に間違っています。このポスターは、 'ClId'の各グループ内の最も高い' Bal'に関連する 'SeqNu'を望んでいました。これは、各SeqNu内で最も高い「Bal」を与える。 – Allan

+0

@Allan - 質問は元の投稿から編集されています。SeqNuとBalだけが含まれていると信じていますので、私の答えです。 –

+0

@DarrenDavies元に戻って元の質問を見ると、出力には常に3列あり、1列のタイトルが欠落していたことがわかります... – RedFilter

0

あなたがする必要があります2つのネストされた0を行うそれをすべて一致する文:

SELECT a.ClID, MAX(b.SeqNu) as SeqNu, b.Balance 
FROM Table a 
JOIN (SELECT ClID, MAX(Balance) as Balance FROM Table GROUP BY ClID) b 
    ON a.ClID = b.ClID AND a.Balance = b.Balance 
GROUP BY a.ClID, b.SeqNu 
+0

こんにちはcjk、ネストされたクエリでは、クライアントIDのseuquence numberを最大値にしています。そして、メインクエリでは、そのバランスを確保します。私はこのケースでは機能しません3 4 45632 –

+0

私は現在動作するはずのMAXを元に戻しました... – cjk

+0

cjk、sequnce番号の重複レコードがあれば、max(seq)が機能します。 max(balance)に基づいてsequnce番号を取得します。ありがとうございました! –

4
select t.* 
from (
    select CIID, 
     MAX(Bal) as MaxBalance 
    from table 
    group by CIID 
    ) sm 
inner join table t on sm.CIID = t.CIID and sm.MaxBalance = t.Bal 

SQL Fiddle example here

+0

このようにすれば、再びテーブルtは異なるsequenceIdを持ち、自動的にすべてのsequencesIDが結果に現れます。最も高いsequnce IDをフィルタリングすることはできません。 1000000を超える他のクライアントとsequnceIDの組み合わせでは、最大残高は同じであると考えてください。間違った結果にチャンスを与えることはできません。ありがとうございました! –

+0

JOIN句は、MaxBalanceと同様にCIID上にあるので、同じMaxBalanceに対して他のCIIDの重複を取得することはありません。同じCIIDに対して重複が2回以上発生する場合は、同じCIIDとMaxBalanceに対して重複が発生することがあります。その場合に返すSeqNoを選択する方法を指定していないので、両方を返します。あなたからの詳細は、私たちのより良い答えです。 – RedFilter

+0

@satish:このクエリは最高のシーケンスIDを使用していません。それは、各クライアントIDの最高のバランスを得て、それらの値を使って正しいシーケンスIDを見つけます。あなたの質問の私の読書に基づいて、この答えは正しいです。 – Allan

0
SELECT b1.* 
FROM balance b1 
LEFT JOIN balance b2 
ON (b1.clid = b2.clid AND b2.bal > b1.bal) 
WHERE b2.clid IS NULL; 

+------+-------+-------+ 
| clid | seqnu | bal | 
+------+-------+-------+ 
| 1 |  1 | 30000 | 
| 2 |  9 | 99999 | 
| 3 |  4 | 45632 | 
+------+-------+-------+ 
3 rows in set (0.00 sec) 
関連する問題