oracle中的dense_rank()分析函数

时间:2012-01-11 18:41:25

标签: sql oracle oracle10g analytic-functions

SELECT empno, deptno
dense_rank() OVER (PARTITION BY deptno
     ORDER BY sal NULLS LAST) SRLNO
FROM emp
WHERE deptno IN (10, 20)
group by empno, deptno  --,sal
ORDER BY deptno, SRLNO;

此查询不起作用,因为Sal应该在group by子句中。任何人都可以解释为什么会这样,并且有没有其他选择在不改变group by子句的情况下获得相同选择的排名?你只想根据工资订购排名。

  

修改
    假设在emp表中有另一个列名commision,我必须通过deptno和commision分组并仅通过deptno进行分区,那么建议的答案是什么:

    SELECT empno, deptno,sum(sal) 
    dense_rank() OVER (PARTITION BY deptno
     ORDER BY sal NULLS LAST) SRLNO
    FROM emp
    WHERE deptno IN (10, 20)
    group by  deptno,commision  --,sal
    ORDER BY deptno, SRLNO;
  

现在我如何通过depno和commision进行分组,并且只能通过deptno进行分区。

如何根据不同的栏目分组不同的栏目并找到排名

1 个答案:

答案 0 :(得分:5)

不要group by任何事情 - 你的partition by为你做了!

更具体地说,由于您在salpartition by中引用了order bygroup by需要了解它才能对结果进行分组。但是,在这种情况下,您不需要group by,因为dense_rank正在使用partition by子句中自己的分区,并且不会跟随group by中的任何内容

关于您的修改,请在那里使用over子句:

sum(sal) over (partition by deptno, commission) as salsum