Аналитическая функция 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;
Теперь, как я могу сгруппировать по depno и commision и только раздел по deptno.
КАК МОЖНО Сгруппировать по РАЗНОЙ КОЛОННЕ И НАЙТИ РАНК, ОСНОВАННЫЙ НА РАЗДЕЛЕ, ПО РАЗНОЙ КОЛОННЕ
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