我的表格如下,
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获胜
任何帮助将不胜感激。谢谢
答案 0 :(得分:0)
您可以使用RANK
:
;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
。如果存在平局,请分别按rn3
和rn4
,TotalExp
和NoticePeriod
排序。
RESULT
| UserId | PreSalary | ExpSalary | TotalExp | NoticePeriod |
|--------|-----------|-----------|----------|--------------|
| 3 | 8200 | 10000 | 5.9 | 15 |