2012-04-13 80 views

回答

2

如果你想获得前5名不同的工资(不论相同金额可能有多少次出现),您需要使用DENSE_RANK()排名功能和CTE来实现这一目标:

DECLARE @salaries TABLE (salary DECIMAL(18,4)) 

INSERT INTO @salaries VALUES(5000) 
INSERT INTO @salaries VALUES(5000) 
INSERT INTO @salaries VALUES(4500) 
INSERT INTO @salaries VALUES(4500) 
INSERT INTO @salaries VALUES(3000) 
INSERT INTO @salaries VALUES(2000) 
INSERT INTO @salaries VALUES(1000) 
INSERT INTO @salaries VALUES(500) 
INSERT INTO @salaries VALUES(400) 

;WITH SalariesRanked AS 
(
    SELECT 
     Salary, 
     SalaryNumber = DENSE_RANK() OVER(ORDER BY Salary DESC) 
    FROM  
     @salaries 
) 
SELECT salary 
FROM SalariesRanked 
WHERE SalaryNumber <= 5 

这导致输出这样的:

salary 
5000.0000 
5000.0000 
4500.0000 
4500.0000 
3000.0000 
2000.0000 
1000.0000 
3
SELECT TOP 5 salary FROM your_table 
ORDER BY salary DESC 
+1

我相信OP希望获得前5名(不同)工资金额 - 无论每个工资金额出现多少次。至少这就是他在中间的编辑似乎表明...... – 2012-04-13 11:33:46

+0

@marc_s:当OP张贴他的问题(正如你所看到的)我的回答是正确的... – Marco 2012-04-13 11:37:36

+0

第一篇文章:是的。但是OP在编辑#4中改变了他的问题以表明目前的情况。 – 2012-04-13 11:38:24

1
select salary 
from 
    (
    select salary, 
      dense_rank() over(order by salary desc) as rn 
    from YourTable 
) as T 
where rn <= 5 

尝试在SE-Data

0
SELECT TOP 5 Salary 
FROM [Table] 
GROUP BY Salary 
ORDER BY Salary DESC 

您需要组查询,以避免重复小号alaries。