按给定等级查找所有实体

Find all entities by given rank

我想了解 T-SQL 中的排名函数,但我不确定自己是否了解。我正在练习 DENSE_RANK() 并且无法理解这里发生的事情:

SELECT 
   EmployeeID,
   FirstName,
   LastName,
   Salary,
   DENSE_RANK() OVER
   (PARTITION BY Salary ORDER BY EmployeeID) AS Rank
FROM  Employees
WHERE Salary BETWEEN 10000 AND 50000
ORDER BY Salary DESC

为什么薪水相同的列有不同的排名?

The rows within a partition that have the same values will receive the same rank.

我的下一个问题是是否可以只找到 Rank 为 2 的实体?

行为正确。您正在根据薪水创建一个组,然后按员工 ID

排序

我猜你想要:

DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank

要过滤您需要使用内联的行 view/cte:

WITH cte AS (
SELECT 
   EmployeeID,
   FirstName,
   LastName,
   Salary,
   DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank
FROM  Employees
WHERE Salary BETWEEN 10000 AND 50000
)
SELECT *
FROM cte
WHERE Rank = 2
ORDER BY Salary DESC

编辑:

Why columns with equal salaries have a different rank?

问题是您根据薪水对数据进行了分区。具有相同值的工资在一个组中。现在,通过使用每个员工不同的 employee_id 列执行该组排序。

没有 PARTITION BY 整个数据集是单个分区,排名基于降序的薪水值。

Why columns with equal salaries have a different rank?

如果您不想看到相同薪水的不同排名,请尝试以下操作

   DENSE_RANK() OVER (ORDER BY Salary desc) AS Rank,

My next question is if it's possible to find only the entities whose Rank is 2?

您可以使用子查询方法或CTE,以下是子查询示例

select *
from (
SELECT 
   EmployeeID,
   FirstName,
   LastName,
   Salary,
   DENSE_RANK() OVER (ORDER BY Salary desc) AS Rank
FROM  Employees
WHERE Salary BETWEEN 10000 AND 50000
) as t 
where r.rank = 2