1

クライアント ID ごとに最大のシーケンス番号を取得したいと思います (最大のシーケンス番号は、銀行口座の最高残高に基づいて計算されます)。

このテーブルには 100000 レコードがあります。

テーブル

ClientSeqTable T1

ClID              SeqId     
1                 11         
1                 12         
1                 13         
1                 14         
1                 15         
2                 16         
2                 17         
2                 18         
2                 19         
3                 110         
3                 111         
3                 112         
3                 113         

SeqBranchTable T2

SeqId    BalID  
11         1  
12         2  
13         3  
14         4  
15         5  
16         6  
17         7  
18         8  
19         9  
110         10  
111         11  
112         12  
113         13

バランステーブル t3

BalID Balance  
1     30000  
2     26789  
3     23456  
4     12345  
5     21234  
6     12456  
7     45632  
8     23456  
9     99999  
10    12345  
11    21234  
12    12456  
13    45632

結果は

ClID              SeqID          Balance  
1                 1              30000  
2                 9              99999  
3                 4              45632

私はこの方法で試しましたが、うまくいきませんでした

SELECT  RS.Investigationid,MAX(stt.sequenceid) 'SeqId', T.HighestBalance 'Balance' 
FROM    ClientSeqTable  T1, SeqBranchTable T2, branbaltable t3,  
                ( SELECT    t1.clid ,MAX(T3.Balance) 'HighestBalance'
                    FROM    ClientSeqTable  T1, SeqBranchTable T2, branbaltable t3,
                    WHERE   t1.seqid =  T2.seqID
                    AND     T2. balId= T3. balId
                    GROUP BY  RS.Investigationid,stt.SequenceId
                    ) T
WHERE   T2.balId =  T3.BalId
AND T1.SeqId = T2.SeqId
AND     T3.HighestBalance = T2.balance
AND     T1.clID = t.ClID
GROUP BY  T1.ClID

上記のクエリ結果は次のとおりです。

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

2 に答える 2

5

row_number 関数を使用できる場合は、次のように機能します。

select 
    *
from 
(
    select 
        t1.ClID, t1.SeqId, t3.Bal, 
        RowNumber = row_number() over (PARTITION BY t1.ClID order by t3.bal desc)
    from 
        ClientSeqTable t1
    inner join
        SeqBranchTable t2 on t2.SeqId = t1.SeqId
    inner join
        Balancetable t3 on t3.BalID = t2.BalID
) t
where
    t.RowNumber = 1

重要なのは、クライアント ID による行番号のパーティション分割と、残高の降順による並べ替えです。

于 2012-04-25T17:58:59.107 に答える
0

MAXでインラインを取得したい場合は、この方法で行うことができます

SELECT t1.ClID, 
       t1.SeqId, 
       t3.Balance 
FROM   ClientSeqTable t1 
       INNER JOIN SeqBranchTable t2 
         ON t2.SeqId = t1.SeqId 
       INNER JOIN Balancetable t3 
         ON t3.BalID = t2.BalID 
       INNER JOIN (SELECT Max(Balance) Bal, 
                          t1.ClID 
                   FROM   ClientSeqTable t1 
                          INNER JOIN SeqBranchTable t2 
                            ON t2.SeqId = t1.SeqId 
                          INNER JOIN Balancetable t3 
                            ON t3.BalID = t2.BalID 
                   GROUP  BY t1.ClID) max_bal 
         ON t1.ClID = max_bal.ClID 
            AND t3.Balance = max_bal.bal  

デモ

ただし、これは実際には row_number ( moutersソリューション)を使用することと同等ではないことに注意してください。max(balance) が同数の場合、ClID ごとに複数の行が返されることがあります。タイを処理する方法が必要で、ウィンドウ関数を使用したい場合は、 RANK を使用できます

于 2012-04-25T18:25:37.543 に答える