2012-01-11 2 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? U хочу заказать ранг только по зарплате.dense_rank() аналитическая функция в оракуле

EDIT
Предположим, что существует другое имя столбца комиссионной в EMP таблице, и я должен группе 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.

КАК Я МОГУ GROUP BY ПО РАЗНЫЕ КОЛОНКА И НАШЛИ RANK НА ОСНОВЕ PARTITION BY ON COLUMN различно

ответ

5

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

+0

: Спасибо за решение, но как я могу группа по с различными столбцами и найти ранг, основанный на другой раздел? –

+0

@ user1138658 - Как я отредактировал, вы захотите использовать 'over' до конца, если у вас разные отличия. Как только вы направляетесь в мир «over», вы хотите избежать «group by» (это можно сделать, это просто очень сложно). – Eric

+0

: Согласен Спасибо :) –