Oracle SQL - Comment obtenir des lignes distinctes à l'aide de RANG() ou DENSE_RANK() ou la fonction ROW_NUMBER() analyse de la fonction?
Je suis à la recherche pour obtenir le top 3 des salaires de chaque département. J'ai été en mesure de le faire soit à l'aide de RANK()
ou DENSE_RANK()
ou ROW_NUMBER()
mais mon tableau est d'avoir quelques enregistrements avec le même salaire.
Mentionnés ci-dessous est ma requête et de son résultat.
Le top 3 des salaires de Dept 20 6000, 3000, 2975.
Mais il y a 2 employés avec un salaire de 3000 et tous les deux ont le rang 2. Donc, c'est de me donner 4 enregistrements pour ce département (1 pour le rang 1, 2 enregistrements de rang2 et 1 record pour rank3).
Veuillez indiquer, le/la conseiller sur comment obtenir les différents top 3 des salaires pour chaque département.
Requête:
SELECT * FROM (
SELECT EMPNO, DEPTNO, SAL,
DENSE_RANK() over (partition by deptno order by sal DESC) as RANK,
row_number() over (partition by deptno order by sal DESC) as ROWNO
from EMP)
WHERE RANK <= 3;
RÉSULTAT:
Empno Deptno Salary Rank Rowno
----------------------------------------
7839 10 5000 1 1
7782 10 2450 2 2
7934 10 1300 3 3
7935 20 6000 1 1
7788 20 3000 2 2
7902 20 3000 2 3
7566 20 2975 3 4
7698 30 2850 1 1
7499 30 1600 2 2
7844 30 1500 3 3
OriginalL'auteur Rakesh | 2014-05-04
Vous devez vous connecter pour publier un commentaire.
Si vous obtenez plus spécifique dans
row_number
, avecpartitioning by dept,salary
alors vous pouvez combinerrow_number
etdense_rank
comme dans cette requête:WITH
bloc et les donnéesOriginalL'auteur zundarz
La
row_number
de la fonction vous avez utilisé devrait faire l'affaire:De retour salaires 6000, 3000, 2975 vous donnera quatre employés - dans la question, vous avez déclaré que vous ne voulez pas que cela. Alors, quelle est la bonne attitude pour vous?
dans le cas de 2 ou plus des employés ayant le même salaire, j'ai besoin de pour obtenir le premier d'un seul..
OriginalL'auteur Mureinik
S'il vous plaît essayer:
OriginalL'auteur user5178682