Sql server 各部门第三高薪

Sql server 各部门第三高薪,sql-server,tsql,Sql Server,Tsql,我有以下表格:CREATE和INSERT语句 如果有,我想在每个部门找到第三高的薪水 我能够做到这一点: 使用以下查询: SELECT *, DENSE_RANK() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS DRank FROM Employees 我不确定DENSE_RANK是否是这里使用的最佳排名函数。可能不是,因为WHERE=3可能返回多个结果,但我们可以说是TOP1。你觉得这个怎么样

我有以下表格:CREATE和INSERT语句

如果有,我想在每个部门找到第三高的薪水

我能够做到这一点: 使用以下查询:

SELECT *,
       DENSE_RANK() OVER 
       (PARTITION BY DepartmentId ORDER BY Salary DESC) AS DRank
FROM Employees
我不确定DENSE_RANK是否是这里使用的最佳排名函数。可能不是,因为WHERE=3可能返回多个结果,但我们可以说是TOP1。你觉得这个怎么样?现在,如果存在这样的情况,如何显示每个部门的第三高工资?

试试这个


Select EmployeeID,FirstName,DepartmentID,Salary
 From (
Select *
      ,RN  = Row_Number() over (Partition By DepartmentID Order By Salary)
      ,Cnt = sum(1) over (Partition By DepartmentID)
 From  Employees
      ) A
 Where RN = case when Cnt<3 then Cnt else 3 end

你就快到了,但是你可以通过行数来实现,而不是密集排列。我认为下面的问题应该会有所帮助

WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS DRank
   FROM Employees
)
SELECT *
FROM cte
WHERE DRank= 3

听起来您已经回答了您的问题:只需选择排名前1的行,因为具有相同排名的行将具有其排名依据的相同值,因此无论top 1返回什么,它都将具有相同的值。where子句在做什么?