2012-04-25 1 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 

결과는 다음

01,235 16,
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로 분할 한 후 순서입니다. 당신이 MAX에 인라인을 얻고 싶었다 경우

+0

@@@@ 나는 10000 점을주는 적절한 평판이 없습니다. 이 순간에 저는 매우 감사합니다. 너는 내 날을 만든 사람이다. –

+0

문제가 없지만 쿼리를 단순화하기 위해 점점 더 많은 행 번호를 사용하고있는 것처럼 보입니다. –

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 솔루션)를 사용하여 실제로 동일하지 않습니다주의해야한다. max (balance)에 동점이있는 경우 ClID 당 여러 행을 반환 할 수 있습니다. 당신이 넥타이를 처리하는 방법이 필요하고 윈도우 함수 you could use RANK을 사용하고 싶다면.