oracle中的dense_rank()分析函数

Gau*_*oni 3 sql oracle analytic-functions oracle10g

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;
Run Code Online (Sandbox Code Playgroud)

此查询不起作用,因为它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;
Run Code Online (Sandbox Code Playgroud)

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

如何在不同的列上进行分组并根据不同列的分区查找排名

Eri*_*ric 5

什么都不做group by- 你partition by为它做了!

更具体地讲,因为你引用sal你的partition byorder by,group by需要注意的是分组的结果是卜.但是,在这种情况下,您不需要,group by因为您dense_rank正在使用自己的partition by子句分区,并且不会遵循其中的任何内容group by.

关于您的编辑,请over在那里使用您的子句:

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