比较多个记录根据过滤条件

时间:2015-10-20 06:53:38

标签: sql sql-server database sql-server-2008

我的表格如下,

   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

我希望将所有行与第一个Record和Fetch top 1 Record进行比较,该记录的值最接近第一个记录。

我正在使用Sql Server 2008 Edition,我的查询尝试是,

    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 UserId 2胜, 比较最后3行ExpSalary UserId 2胜, 比较最近3行的TotalExp UserId 3胜, 比较最后3行NoticePeriod UserId 3胜

如果两个UserID之间出现平局,则TotalExp和NoticePeriod将获得优先级。 所以USerID 3获胜

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分: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排序。

RESULT

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