仅在SQL中使用自我连接生成具有分区的row_number()

时间:2019-06-07 15:18:27

标签: sql sql-server self-join

当我们尝试基于分区列对行进行排序时,我们都使用ROW_NUMBER()OVER(按Column1进行分区)。这是我的问题-

给表Employee提供两列(Emp_id,Salary)。如何不使用以下任何一项从此表返回前10行(按薪水排序)。

排名,CTE,子查询,最高,限额,生成器,排序依据,变量,用户定义的或内置函数或内置于数据库的特定功能。

这是SQL Fiddle链接 http://www.sqlfiddle.com/#!18/22ab9/10

使它在某种程度上起作用的唯一方法是使用自连接并使用“具有”过滤前10位。但是,我无法生成行号。如果有平局,我给参与的行分配相同的排名,导致返回的前10行错误。

-这是我写的

select e1.Emp_id, e1.Salary, count(distinct e2.salary) rnk
from
  Employee e1
  join
  Employee e2 on e1.Salary <= e2.Salary
group by
  e1.Emp_id, e1.salary
having count(distinct e2.salary)<= 10

-这是我期望它的行为

select *
from
(
select e1.Emp_Id, e1.Salary, ROW_NUMBER() OVER (Order by Salary desc) rnk
from Employee e1
) a where rnk <= 10

我如何处理自连接中的纽带,仍然能够为其分配不同的等级/行号?

2 个答案:

答案 0 :(得分:1)

您可以使用两个比较。假设emp_id是唯一的:

select e1.Emp_id, e1.Salary, count(distinct e2.salary) as rnk
from Employee e1 join
     Employee e2
     on e1.Salary < e2.Salary or
        (e1.Salary = e2.Salary and e1.emp_id <= e.emp_id)
group by e1.Emp_id, e1.salary
having count(distinct e2.salary) <= 10

答案 1 :(得分:0)

从戈登的答案中得出结论,我认为这对我有用。

select e1.Emp_id, e1.Salary, count(*) as rnk
from Employee e1 join
     Employee e2
     on e1.Salary < e2.Salary  or
        (e1.Salary = e2.Salary and e1.emp_id <= e2.emp_id)
group by e1.Emp_id, e1.salary
having count(*) <= 10