2012-04-25 6 views
1

各クライアントIDに最大のシーケンス番号を使用したいと考えています(最大のシーケンス番号は銀行口座残高の最高額に基づいて計算されます)。ネストした結合による最高のSeq番号の選択

この表には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 

Balancetable 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 
+0

例のクエリがデータの例と一致しません。 T1.SeqIdがクエリに表示されますが、データの例には表示されません! –

+0

T1はどのようにT2に関連し、T2はどのようにT3に関連していますか? –

+0

t1.seqid = T2.seqID&T2。 branchId = T3。 branchId –

答えて

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でパーティションして、バランスの降順で順序です。

+0

@@@@私はあなたに10000点を与えるという適切な評判はありません。この瞬間、私は、とてもありがとうございます!あなたは私の一日を作った男です! –

+0

問題はありませんが、私は照会を単純化するために行番号をますます使用しているようです。 –

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 

DEMO

しかし、あなたは、これは実際にはROW_NUMBER(mouters液)を使用するのと同じではありません注意する必要があり、それを行うことができます。これは、最大(残高)の同値がある場合、ClIDごとに複数の行を返す可能性があります。あなたがネクタイを扱うそのような方法が必要であり、ウィンドウ関数you could use RANKを使用したい場合。

関連する問題