Аналитическая функция 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

Другие вопросы по тегам