【问题标题】:OracleSQL Finding top N rows from a group [duplicate]Oracle SQL从组中查找前N行[重复]
【发布时间】:2015-03-30 14:26:01
【问题描述】:

我正在尝试查询前 N 行,但在 OracleSQL 内部有一个组

例如:

+-----+----------+----+------+
|JobID|JobTitle  |Pay |Name  |
+-----+----------+----+------+
|012  |Manager   |400 |Bob   |
|012  |Manager   |400 |Gemma |
|012  |Manager   |400 |Ash   |
|020  |Supervisor|400 |Dan   |
|020  |Supervisor|400 |Hannah|
|013  |Clerk     |300 |Sarah |
+-----+----------+----+------+

从上面的示例中,我想找到一个职位下的所有员工,然后只显示前 3 个最高薪的职位,然后按首付排序。

+-----+----------+----+------+
|JobID|JobTitle  |Pay |Name  |
+-----+----------+----+------+
|02   |Manager   |400 |Bob   |
|02   |Manager   |400 |Gemma |
|02   |Manager   |400 |Ash   |
|04   |Supervisor|400 |Dan   |
|04   |Supervisor|400 |Hannah|
|03   |Clerk     |300 |Sarah |
|01   |Cleaner   |200 |Scruff|
|01   |Cleaner   |200 |Fry   |
+-----+----------+----+------+

应该是桌子。

我尝试使用子查询,然后添加 rownum

    SELECT * FROM 
      ( SELECT JobID, MAX(Pay) AS Pay, JobTitle, EmpID, Name 
        FROM Employees,Jobs
        WHERE JobID = Employees.Job_ID
        GROUP BY JobID, Pay, EmpID, JobTitle,
        ORDER BY Pay DESC)
     WHERE ROWNUM <= 3;

【问题讨论】:

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


    【解决方案1】:

    最好使用窗口函数:

    select jobid, jobtitle, pay, name
    from (
      select j.jobid, j.jobtitle, e.pay, e.name, 
             row_number() over (partition by j.jobid order by e.pay desc) as rn
      from employees e 
        join jobs j on j.jobid = e.job_id
    ) 
    where rn <= 3
    order by jobid, jobtitle, pay desc;
    

    我还将 where 子句中过时的隐式连接更改为显式 JOIN

    【讨论】:

    • 第 9 行出现错误:ORA-00933: SQL 命令未正确结束
    • 这是因为WHERE 低于ORDER BY - 只需将两者调换并注意分号。
    • 这行得通,但由于某种原因,我仍在提取所有数据,而不仅仅是前 3 个,当我按 jobid、jobtitle、pay 排序时,我得到了结果,但顺序相反。
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多