为分组数据集创建前N个查询的问题

时间:2016-01-07 12:24:11

标签: mysql sql oracle greatest-n-per-group

我正在进行数据库查询,我遇到了创建正确查询以获取所需输出的问题。 下面是我的create table query和insert语句。

create table DETAILS (dep_name varchar(50), emp_name varchar(50), salary int);

insert into DETAILS values ('marketing', 'ravi', 50000);  
insert into DETAILS values ('marketing', 'suresh', 25000);  
insert into DETAILS values ('marketing', 'mahesh', 60000);  
insert into DETAILS values ('legal', 'raja', 40000);  
insert into DETAILS values ('legal', 'gavi', 50000);  
insert into DETAILS values ('legal', 'rana', 90000);  
insert into DETAILS values ('legal', 'jyoti', 60000);  

我的要求是只显示每个部门的前2名受薪员工。请参阅下面的示例输出。

dep_name    emp_name    salary  
legal       rana        90000  
legal       jyoti       60000  
marketing   mahesh      60000  
marketing   ravi        50000

我尝试了几个查询,但无法解决这个问题。有人可以让我构建正确的查询吗?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Oracle,则可以dense_rank() over (partition by .. order by ..)

完成

如果您的RDBMS为mysql,则无法使用dense_rank(),您必须模仿此概念。

请参阅此link

尝试:

select 
    dep_name,
    emp_name,
    salary
from (
    SELECT 
        @row_number:=CASE
            WHEN @dep_name = dep_name THEN @row_number + 1
            ELSE 1
        END AS num,
        @dep_name := dep_name as dep_name,
        emp_name,
        salary
    FROM DETAILS ,(SELECT @dep_name := '', @row_number := 0) as t
    ORDER BY dep_name, salary desc
) x
where num < 3
ORDER BY dep_name, salary desc;

sql fiddle demo

答案 1 :(得分:1)

这将是在MySQL(未测试)

中执行此操作的一个选项
SELECT  dep_name, emp_name, salary
FROM (
  SELECT
    @nr :=  IF(@old_val = c.col,(@nr +1),1) AS nr,
    @old_val:=c.col AS tmp,
    c.* 
  FROM details AS c , (SELECT @nr:=0, @old_val:='') AS TMP 
  ORDER BY salary DESC
) AS result WHERE nr < 3