2015-10-20 63 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 |