2012-04-25 24 views
1

我想爲每個客戶端編號採用最大序列號(最大序列號將根據最高銀行賬戶餘額計算)。通過嵌套加入選擇最高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顯示在您的查詢中,但不顯示在您的數據示例中! – 2012-04-25 17:31:37

+0

T1與T2的關係如何?T2與T2的關係如何? – 2012-04-25 17:32:59

+0

t1.seqid = T2.seqID&T2。 branchId = T3。 branchId – 2012-04-25 17:38:00

回答

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分。在這一刻我想說,非常感謝!你是男人,是誰造了我的一天! – 2012-04-25 18:12:43

+0

沒問題,我似乎越來越多地使用行號來簡化查詢。 – 2012-04-25 18:54:35

0

如果你想獲得最大您在網上,你可以這樣來做

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