2015-10-20 62 views
0

我的表如下取頂部1的記錄,比較多個記錄基於過濾條件

UserID PreSalary ExpSalary TotalExp NoticePeriod 
    1   1000   2500   2    30 
    2   1700   5000   2.6   60 
    3   8200   10000   5.9   15 
    4   3000.5  6000.75  4    20 

我想比較所有以第一名的成績排和取前1條具有最靠近第一值記錄。

我使用SQL Server 2008版和我查詢的嘗試是,

Select * from #tbl GROUP by UserID ,PreSalary ,ExpSalary ,TotalExp,NoticePeriod Having (MAX(TotalExp) = (Select top 2 TotalExp from #tbl ) ,MIN(PreSalary) = (Select top 2 PreSalary from #tbl) ) 

預期的輸出是

UserID PreSalary ExpSalary TotalExp NoticePeriod 
    2   8200  10000   5.9   15 

說明: 最後3行的PreSalary用戶ID 2勝相比, 比較ExpSalary UserId的最後3行2勝, 比較TotalExp的最後3行UserId 3勝, 比較前3個r NoticePeriod UserId 3ows

如果在兩個用戶標識之間發生聯繫,那麼TotalExp和NoticePeriod會被賦予優先級。 So USerID 3勝

任何幫助,將不勝感激。謝謝

+0

什麼是預期的結果? –

+0

根據以上數據,你期望輸出什麼? –

+0

爲什麼跟最後3行比較? –

回答

0

您可以通過使用RANK做到這一點:

SQL Fiddle

;WITH Cte AS(
    SELECT t.*, 
     rn1 = RANK() OVER(ORDER BY t.PreSalary - x.PreSalary), 
     rn2 = RANK() OVER(ORDER BY t.ExpSalary - x.ExpSalary), 
     rn3 = RANK() OVER(ORDER BY t.TotalExp - x.TotalExp DESC), 
     rn4 = RANK() OVER(ORDER BY t.NoticePeriod - x.NoticePeriod) 
    FROM tbl t 
    CROSS APPLY(
     SELECT TOP 1 
      PreSalary, ExpSalary, TotalExp, NoticePeriod 
     FROM tbl 
     ORDER BY UserID 
    )x 
    WHERE UserID <>(SELECT TOP 1 UserID FROM tbl ORDER BY UserID) 
) 
SELECT TOP 1 
    UserId, PreSalary, ExpSalary, TotalExp, NoticePeriod 
FROM Cte 
ORDER BY 
    rn1 + rn2 + rn3 + rn4, 
    rn3, 
    rn4 

SELECT TOP 1 UserID FROM tbl ORDER BY UserID 

以上將返回你的基地備案。這個想法是爲每一行(基數除外)對基記錄進行排序。這是使用RANK完成的。

在最後的SELECT上,優先級將基於總體排名,因此rn1 + rn2 + rn3 + rn4。如果存在平行關係,請分別訂購rn3rn4TotalExpNoticePeriod


結果

| UserId | PreSalary | ExpSalary | TotalExp | NoticePeriod | 
|--------|-----------|-----------|----------|--------------| 
|  3 |  8200 |  10000 |  5.9 |   15 |