Аналитическая функция density_rank () в Oracle - PullRequest
3 голосов
/ 11 января 2012
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;

теперь, как я могу группировать по depno и commision и только разделить по deptno.

КАК МОЖНО Сгруппировать по РАЗНОЙ КОЛОННЕ И НАЙТИ РЕЙТИНГ НА ОСНОВЕ РАЗДЕЛА ПО РАЗНОЙ КОЛОННЕ

1 Ответ

5 голосов
/ 11 января 2012

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

...