【问题标题】:dense_rank() analytic function in oracleoracle中的dense_rank()解析函数
【发布时间】:2012-02-08 03:15:54
【问题描述】:
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 分区。

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

【问题讨论】:

    标签: sql oracle oracle10g analytic-functions


    【解决方案1】:

    不要group by 做任何事——你的partition by 为你做!

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

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

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

    【讨论】:

    • :感谢您的解决方案,但是我如何按不同的列分组并根据不同的分区找到排名?
    • @user1138658 - 正如我编辑的那样,如果您有不同的粒度,您将希望一直使用over。一旦你进入over 世界,你就想避开group by(这是可以做到的,只是真的很棘手)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多