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进行分区。
如何根据不同的栏目分组不同的栏目并找到排名
答案 0 :(得分:5)
不要group by
任何事情 - 你的partition by
为你做了!
更具体地说,由于您在sal
和partition by
中引用了order by
,group by
需要了解它才能对结果进行分组。但是,在这种情况下,您不需要group by
,因为dense_rank
正在使用partition by
子句中自己的分区,并且不会跟随group by
中的任何内容
关于您的修改,请在那里使用over
子句:
sum(sal) over (partition by deptno, commission) as salsum