Аналитическая функция density_rank () в Oracle

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? Вы хотите упорядочить ранг только на основе зарплаты.

РЕДАКТИРОВАТЬ
Предположим, что в таблице emp есть еще одно имя столбца, и мне нужно сгруппировать по 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;

теперь как я могу группировать по депно и комиссии и только раздел по дептно.

КАК Я МОГУ ГРУППИРОВАТЬ ПО РАЗНЫМ СТОЛБЦАМ И НАЙТИ РАНГ ПО РАЗДЕЛЕНИЯМ ПО РАЗНЫМ СТОЛБЦАМ


person Gaurav Soni    schedule 11.01.2012    source источник


Ответы (1)


Не 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

person Eric    schedule 11.01.2012
comment
: Спасибо за решение, но как я могу сгруппировать по разным столбцам и найти ранг по разным разделам? - person Gaurav Soni; 11.01.2012
comment
@ user1138658 - Как я редактировал, вы захотите использовать over полностью, если у вас разные уровни детализации. Попав в мир over, вы захотите избежать group by (это можно сделать, это действительно сложно). - person Eric; 11.01.2012