2013-07-23 99 views
0

我有一個表1是這個樣子:SQL服務器選擇排名數據的初審與扭曲

Wallet No Status  Rank 
01774076563 Scanned  1 
01765653275 Registered 3 
01774076563 Accepted 2 
01768836816 Rejected 4 
01967866981 Accepted 2 
01967866981 Rejected 4 

我希望它看起來像這樣(表2):

Wallet No Status  Rank 
01774076563 Scanned  1 
01765653275 Registered 3 
01768836816 Rejected 4 
01967866981 Accepted 2 

我有使用下面的代碼,但它顯示Table1而不是Table2:

SELECT MIN([Rank]) AS [Rank], STATUS_, walletno into table2 
FROM table1 
GROUP BY STATUS_, walletno 

我想要的只是最高排名錢包沒有和狀態,什麼都沒有其他。但Table2給了我Table1的精確副本。我在這裏做錯了什麼?

+0

希望表看起來不同?改變表格。如果你希望你的選擇看起來不同,那是不同的。 – Learner

+0

@jpw:對不起編輯過表格。我想要的只是最高級別的錢包號碼和地位,沒有別的。但Table2給了我Table1的精確副本。 –

回答

1

您正在查找完整的行,而不僅僅是最小值。爲此,窗口功能非常方便。

因爲你的邏輯使用min(),這裏是使用該功能的方法:

SELECT [Rank], STATUS_, walletno into table2 
FROM (select t.*, 
      MIN([rank]) over (partition by walletno) as minrank 
     from table1 t 
    ) t 
where [rank] = minrank; 

子查詢計算每個錢包的最低排名。外部過濾器只保留那一行。

我通常會用row_number()因爲這樣寫:

SELECT [Rank], STATUS_, walletno into table2 
FROM (select t.*, 
      row_number() over (partition by walletno order by [rank]) as seqnum 
     from table1 t 
    ) t 
where seqnum = 1; 

但兩人應該是在性能方面非常相似。主要區別在於兩行具有相同的最小等級。第一個版本將返回兩行。第二個會隨意選擇其中的一個。

0

你可以試試這個:

;WITH CTE as 
(
SELECT 
    WalletNo, 
    Status, 
    ROW_NUMBER() OVER(PARTITION BY Status ORDER BY Rank) AS Row, 
    Rank 
    FROM 
    Item 
) 
SELECT WalletNo, Status, Row, Rank From CTE Where Row = 1 

小提琴這裏:http://sqlfiddle.com/#!3/14fa5/6