Oracle帮助选择数据

时间:2013-07-16 14:28:30

标签: database oracle

我有一张表sal_info,如下所示

ID  NAME    SAL DEPTNO
100 SARMA   5000    10
101 SARATHI 5000    10
102 RAJESH  4000    10
103 PRAVEEN 4000    20
104 GOPI    4000    20
105 SHANKAR 3000    20
106 SHIVA   2000    30
107 SWAMI   1000    30
108 MOHAMED 500     30

我需要提取每个deptno上具有最高薪水的行

我的输出应该是

ID  NAME    SAL DEPTNO
100 SARMA   5000    10
101 SARATHI 5000    10
103 PRAVEEN 4000    20
104 GOPI    4000    20
106 SHIVA   2000    30

我怎样才能完成这个

我试过这个。

select * from dummy_tab where sal in (select max(sal) from dummy_tab)

它是根据表格中的最高工资向我提供的。我需要把它包括在所有的部门中。

任何想法.......

3 个答案:

答案 0 :(得分:2)

分析功能最适用于此。在这种情况下,我会使用RANK。请注意,该链接包含RANK函数的聚合和分析风格的文档;这是你想要阅读的分析性的。

查询将如下所示:

SELECT ID, Name, Sal, DeptNo
FROM (
  SELECT
    ID,
    Name,
    Sal,
    DeptNo,
    RANK() OVER (PARTITION BY DeptNo ORDER BY Sal DESC) AS SalRank
  FROM sal_info
)
WHERE SalRank = 1

要更深入地了解RANK的工作原理,请尝试仅运行内部查询。这将显示排名分配。

答案 1 :(得分:1)

SELECT *
FROM 
   SAL_INFO
WHERE
    (DEPTNO, SAL)
    IN
    (
        SELECT 
            DEPTNO, MAX(SAL) 
        FROM SAL_INFO
        GROUP BY DEPTNO
    )

这是SQLFiddler

答案 2 :(得分:0)

@Tamim Salem

我用来获取我为你的答案指定的第二个条件的结果的查询

    select * from dummy_tab where (deptno,sal) in 
    (select deptno, max(sal) from   
    (select * from dummy_tab
    where (deptno,sal) in 
    (
    select deptno,max(sal) from dummy_tab group by deptno having count(*)>1
    )
    ) y group by y.deptno having count(*)>1
    )