2012-04-25 65 views
1

可能重複:
Selecting the Highest Seq Number by nested JoiningSQL表最高序列號

你好,我要編寫一個查詢,我想借最大的序列號爲每個客戶端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 
+0

這可能是我的編輯......但我認爲你是正確 – cjk 2012-04-25 13:50:03

+1

這聽起來就像你想要最高的'Bal',而不是'SeqNu' - 你的問題標題是否正確? – RedFilter 2012-04-25 13:56:00

+0

RedFileter,我需要客戶端的最高號碼(基於客戶端ID的最高餘額) – 2012-04-25 14:00:55

回答

2

的最佳方式,這將很可能取決於您正在使用RDBMS來完成。如果你有窗函數(甲骨文9I +或SQL Server 2012,例如),下面應該工作:

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

@阿倫 - 看起來,合理的,讓我試試這個。 – 2012-04-25 14:10:41

+0

@Allen,Hha是的,我不能在2008r2上使用這個查詢。但按照您的查詢邏輯,我可能會達到我的要求。有沒有其他辦法可以實現我的問題?謝謝。 – 2012-04-25 15:16:26

+0

如果你不能使用窗口函數,@ RedFilter的答案是最好的方法。如果它解決了你的問題,一定要選擇它作爲答案。 – Allan 2012-04-25 16:27:01

2

您需要使用GROUP BY

SELECT SeqNu, MAX(Bal) 
FROM Table 
GROUP BY SeqNu 
+0

這完全是錯誤的。海報想要在每個「ClId」組中與最高的「Bal」關聯的「SeqNu」。這給每個「SeqNu」中最高的「Bal」。 – Allan 2012-04-25 13:57:58

+0

@Allan - 這個問題已被編輯,從原來的帖子,我相信它只包括SeqNu和巴爾,因此我的答案。 – 2012-04-25 13:59:41

+0

@DarrenDavies如果你回過頭來看看原來的問題,你可以看到輸出中總是有3列,只有一列的標題丟失了...... – RedFilter 2012-04-25 14:06:35

0

您需要做兩個嵌套的MAX個語句匹配了這一切:

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

嗨cjk,在你的嵌套查詢中,我們爲clientId取最大的序號,然後在主查詢中我們爲這個平衡分配。我不這樣做的案件3 4 45632 – 2012-04-25 13:55:12

+0

我已經扭轉了現在應該工作的MAX ... – cjk 2012-04-25 13:59:04

+0

cjk,如果有任何重複記錄在sequnce號碼,那麼你的最大(seq)的作品,我們必須根據最大(餘額)採取sequnce數字。謝謝! – 2012-04-25 14:05:03

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 Fiddle example here

+0

如果我們這樣做,再次表t有不同的sequenceId,所有的sequenceID都會自動完成。我們無法過濾最高的sequnce ID。請考慮最大餘額可能是相同的任何其他客戶端和sequnceID組合出1000000條記錄。我們不能給出錯誤結果的機會。謝謝! – 2012-04-25 13:58:10

+0

JOIN子句在CIID以及MaxBalance上,所以不,您不會得到相同MaxBalance的其他CIID的重複。不過,如果同一個CIID出現多次平衡,您可能會得到相同CIID和MaxBalance的重複值。在這種情況下,你沒有指定如何選擇返回哪個SeqNo,所以我同時返回。來自你的更多細節=來自我們的更好答案。 – RedFilter 2012-04-25 14:02:14

+0

@satish:這個查詢沒有使用最高的序列ID。它獲得每個客戶端ID的最高餘額,然後使用這些值查找正確的序列ID。根據我對你的問題的閱讀,這個答案是正確的。 – Allan 2012-04-25 14:03:48

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)