2012-01-11 19 views
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子句的情况下在同一select中获得排名?你想根据工资排名。oracle中的dense_rank()解析函数

编辑
假设有EMP表的另一列名佣金,我必须GROUP BY 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分区。

我集团通过在不同怎么可以COLUMN和查找RANK基于划分由不同的充柱

回答

5

不要group by什么 - 你的partition by会为你!

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

关于你的编辑,有使用over条款:

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

+0

:谢谢你的解决方案,但我怎么能与不同的列,并找到根据不同的分区排名小组? – 2012-01-11 19:04:33

+0

@ user1138658 - 在我编辑过程中,如果您有不同的粒度,您会希望一直使用“over”。一旦进入'over'世界,你想避免'group by'(它可以完成,这真的很棘手)。 – Eric 2012-01-11 19:06:58

+0

:同意谢谢:) – 2012-01-11 19:11:57