当我们尝试基于分区列对行进行排序时,我们都使用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
我如何处理自连接中的纽带,仍然能够为其分配不同的等级/行号?
答案 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