3
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 和佣金分组,只按 deptno 分区。

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

4

1 回答 1

5

什么都不要group by——你partition by为你做的!

更具体地说,由于您salpartition byand中引用order bygroup by因此需要注意它以对结果进行分组。但是,在这种情况下,您不需要 ,group by因为您dense_rank正在使用它自己的partition by子句分区,并且不会遵循group by.

关于您的编辑,请在over此处使用您的子句:

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

于 2012-01-11T18:49:59.773 回答