我正在进行数据库查询,我遇到了创建正确查询以获取所需输出的问题。 下面是我的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
我尝试了几个查询,但无法解决这个问题。有人可以让我构建正确的查询吗?
答案 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;
答案 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