Sql server 按给定等级查找所有实体
我试图理解T-SQL中的排名函数,但我不确定我是否理解。我正在练习Sql server 按给定等级查找所有实体,sql-server,dense-rank,Sql Server,Dense Rank,我试图理解T-SQL中的排名函数,但我不确定我是否理解。我正在练习DENSE\u RANK(),在理解这里发生的事情时遇到困难: SELECT EmployeeID, FirstName, LastName, Salary, DENSE_RANK() OVER (PARTITION BY Salary ORDER BY EmployeeID) AS Rank FROM Employees WHERE Salary BETWEEN 10000 AND 500
DENSE\u 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
为什么薪酬相同的栏目排名不同
分区中具有相同值的行将接收相同的秩
我的下一个问题是,是否有可能只找到排名为2的实体 这种行为是正确的。您正在根据薪资创建一个组,然后根据员工id进行订购 我想你想要:
DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank
要筛选行,您需要使用内联视图/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
编辑:
为什么薪酬相同的栏目排名不同
问题是您根据薪资对数据进行了分区。相同值的薪资在单个组中。现在,对于该组,使用每个员工不同的employee\u id
列执行排序
如果不使用
PARTITION BY
,则整个数据集都是单个分区,排名基于降薪值。行为是正确的。您正在根据薪资创建一个组,然后根据员工id进行订购
我想你想要:
DENSE_RANK() OVER(ORDER BY Salary DESC) AS Rank
要筛选行,您需要使用内联视图/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
编辑:
为什么薪酬相同的栏目排名不同
问题是您根据薪资对数据进行了分区。相同值的薪资在单个组中。现在,对于该组,使用每个员工不同的employee\u id
列执行排序
如果没有partitionby
,则整个数据集是单个分区,排名基于降序工资值
为什么薪酬相同的栏目排名不同
如果您不想看到同一薪水的不同等级,请尝试以下内容
DENSE_RANK() OVER (ORDER BY Salary desc) AS Rank,
我的下一个问题是,是否有可能只找到排名为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
为什么薪酬相同的栏目排名不同
如果您不想看到同一薪水的不同等级,请尝试以下内容
DENSE_RANK() OVER (ORDER BY Salary desc) AS Rank,
我的下一个问题是,是否有可能只找到排名为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
谢谢你的回复!我很感激,但我不确定我是否理解它是如何工作的。(
DENSE\u RANK()
)@AndrewRogers我已经扩展了答案谢谢你的回复!我很感激,但我不确定我是否理解它是如何工作的。(DENSE\u RANK()
)@AndrewRogers我已经扩展了答案