Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction Oracle Analytic pour la valeur min dans le regroupement

Je pense que la fonction Rank() n'est pas la solution, pour deux raisons.

Premièrement, elle est probablement moins efficace qu'une méthode basée sur Min().

La raison en est que la requête doit maintenir une liste ordonnée de tous les salaires par département au fur et à mesure qu'elle scanne les données, et le rang sera ensuite attribué plus tard en relisant cette liste. Évidemment, en l'absence d'index pouvant être exploités à cet effet, vous ne pouvez pas attribuer de classement tant que le dernier élément de données n'a pas été lu, et la maintenance de la liste est coûteuse.

Ainsi, les performances de la fonction Rank() dépendent du nombre total d'éléments à analyser, et si le nombre est suffisant pour que le tri se répande sur le disque, les performances s'effondreront.

C'est probablement plus efficace :

select dept,
       emp,
       salary
from
       (
       SELECT dept, 
              emp,
              salary,
              Min(salary) Over (Partition By dept) min_salary
       FROM   mytable
       )
where salary = min_salary
/

Cette méthode nécessite uniquement que la requête maintienne une seule valeur par département de la valeur minimale rencontrée jusqu'à présent. Si un nouveau minimum est rencontré, la valeur existante est modifiée, sinon la nouvelle valeur est rejetée. Le nombre total d'éléments qui doivent être conservés en mémoire est lié au nombre de départements, et non au nombre de lignes numérisées.

Il se pourrait qu'Oracle ait un chemin de code pour reconnaître que le rang n'a pas vraiment besoin d'être calculé dans ce cas, mais je ne parierais pas dessus.

La deuxième raison de ne pas aimer Rank () est qu'il répond simplement à la mauvaise question. La question n'est pas "Quels enregistrements ont le salaire qui est le premier rang lorsque les salaires par département sont classés par ordre croissant", c'est "Quels enregistrements ont le salaire qui est le minimum par département". Cela fait une grande différence pour moi, au moins.