【问题标题】:Issues creating top N query for grouped datsets为分组数据集创建前 N 个查询的问题
【发布时间】:2016-01-07 12:24:11
【问题描述】:

我正在处理数据库查询,但在创建正确的查询以获得所需的输出时遇到问题。 下面是我的创建表查询和插入语句。

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

我已经尝试了几个查询,但无法破解。有人可以让我构建正确的查询吗?

【问题讨论】:

  • 我删除了额外的数据库标签。随意添加您实际使用的数据库。

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


【解决方案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

【讨论】:

    【解决方案2】:

    这将是在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 2021-01-06
      • 2010-12-14
      • 2011-06-28
      • 1970-01-01
      • 2020-06-18
      • 2021-10-09
      • 1970-01-01
      相关资源
      最近更新 更多