1

重複の可能性:
ネストされた結合による最大のシーケンス番号の選択

こんにちは私はクエリを書かなければなりません、私は各クライアントIDに対して最大のシーケンス番号を取得したいと思います(大きなシーケンス番号は最大の銀行口座残高に基づいて計算されます)。

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

表は以下のようになります-

テーブル:

  
** 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

結果は

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

5 に答える 5

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フィドルの例はこちら

于 2012-04-25T13:49:58.170 に答える
2

これを実現するための最良の方法は、使用しているRDBMSによっておそらく異なります。ウィンドウ関数(たとえば、Oracle9i+またはSQLServer2012)がある場合は、次のように機能するはずです。

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
于 2012-04-25T13:54:08.643 に答える
1

を使用する必要がありますGROUP BY

SELECT SeqNu, MAX(Bal)
FROM Table
GROUP BY SeqNu
于 2012-04-25T13:47:24.447 に答える
0

MAXすべてを一致させるには、2つのネストされたステートメントを実行する必要があります。

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
于 2012-04-25T13:49:29.387 に答える
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)
于 2012-04-25T19:10:52.647 に答える