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
应该在分组依据子句中。 谁能解释为什么会这样,有没有其他选择可以在不更改分组依据子句的情况下在同一选择中获得排名? 您只想根据薪水排序排名。
编辑
假设emp表中还有另一个列名comcommissionion,我必须按deptno分组,并且仅按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 进行分区。
如何按不同列分组并根据不同列的分区查找排名
不要group by
任何东西 - 你的partition by
会为你做这件事!
更具体地说,由于您在partition by
和order by
中引用了sal
,group by
需要了解它才能对结果进行分组。但是,在这种情况下,您不需要group by
,因为您的dense_rank
正在使用自己的partition by
子句分区,并且不会遵循group by
中的任何内容。
关于您的编辑,请在此处使用您的over
子句:
sum(sal) over (partition by deptno, commission) as salsum