2014-05-15 46 views
1

我想根據排序的等級和地方級=最上面的排名選擇記錄分類按等級,其中等級=前列

像下表從下表中選擇的名稱,結果將是

| 6| r   | 1 

得到這個紀錄後,我會展示給用戶,然後在一些點擊按鈕,我把它移動到另一個表中,然後用戶詢問下一組結果則下一個結果將是

| 4| v   | 5 

| 7| K   | 5  ---added this line 


|ID| name  | Rank 

| 2| a   | 88 
| 3| b   | 56 
| 8| t   | 12 
| 1| c   | 45 
| 4| v   | 5 
| 7| K   | 5 -- ADDED THIS LINE 
| 5| d   | 11  
| 6| r  | 1  

我試着使用兩個選擇語句,在第一次,我會選它

按職級遞減從Tab順序選擇前1 @的TopRank =等級後獲得最高等級

,然後其次

從標籤

選擇名稱,其中排名= @toprank

但我想要在單個語句中執行它,因爲記錄數以百萬計。

+0

您當前的代碼只是不正確 - 你需要一個'爲了by'這裏;即使有一個聚集索引,這是非常可笑 –

+0

對不起marc,我將編輯我的代碼 – shashank

+0

與你最近的編輯,你有重複'ID'和重複'秩'。這聽起來非常有問題... –

回答

0
create table test(ID int, name char(1), Rank int) 
insert test values 
(2,'a',88),(3,'b',56),(6,'t',12),(1,'c',45), 
(4,'v',5),(4,'K',5),(5,'d',11),(6,'r',1)  

;with cte as 
(
    -- if you only want 1 row at a time, exclude 'with ties' 
    select top 1 with ties ID, name, Rank 
    from test 
    order by rank 
) 
delete 
from cte 
output deleted.ID, deleted.name, deleted.Rank 

結果第一輪:

ID name Rank 
6 r  1 

結果第二輪:

ID name Rank 
4 v  5 
4 K  5 
+0

對於取消檢查我的答案感到抱歉。 我們不能使用row_number()over(partition by ....)方法 – shashank

+0

@shashank我寫了一個像這樣的解決方案,但決定這會比排名函數更好 –

1

所以第一關SELECT要顯示給用戶的記錄:

SELECT * FROM [YOUR_TABLE] 
WHERE Rank = (SELECT TOP 1 Rank FROM [YOUR_TABLE] ORDER BY Rank) 

這將返回與您可以向用戶顯示爲即將記錄的最高級別的一個或多個行被刪除/移動。

假設您正在存儲返回給用戶的Rank,然後可以將其用作刪除&移動/歸檔操作中的參數。

DECLARE @Rank int 
SET @Rank = 1 -- this would be passed in to the procedure 

-- MOVE DATA 
INSERT INTO [YOUR_ARCHIVE_TABLE] (ID, Name, Rank) 
(SELECT ID, Name, Rank FROM [YOUR_TABLE] WHERE Rank = @Rank) 

--DELETE DATA 
DELETE FROM [YOUR_TABLE] 
WHERE Rank = @RankToDelete 
+0

這對刪除沒有幫助 –

+0

@MarcGravell當前正在編輯 – Tanner

+0

通過編輯,它不顯示選定的行;你可能可以添加一個帶輸出的子句,雖然 - 也就是從[YOUR_TABLE]輸出刪除刪除。*其中ID = ...' –