Que ce soit les 10 chansons les plus
vendus par style de musique dans une boutique en ligne, les 3
meilleurs pointeurs par équipes, les 5 dernières nouvelles par
catégories, il y a des cas où on veut dans nos rapport un nombre
prédéfini de résultat selon un groupe de données en particulier.
Malheureusement, SQL Server ne nous donne pas un outil ou instruction
pour le faire de façon simple et efficace.
Qu'à cela ne tienne, on peut
contourner cette limitation en employant l'un ou l'autre des
techniques ci-dessous.
Technique de la numérotation
La première technique consiste à
numéroter chaque ligne de résultat selon le groupe de données
désiré puis d'y appliquer un filtre sur les numéros pour ne
retourner que les X résultats souhaités par sous-groupe de données.
Par exemple, disons que nous voulons
connaitre les trois produits qui se sont le plus vendus par années
pour la compagnie AdventureWork. Il faudra tout d'abord construire
une requête pour numéroter le résultat.
Ensuite, on y applique un filtre pour
ne retourner que les valeurs désirées.
Voila, un top 3 des meilleurs vendeurs
par année.
Cette technique fonctionne bien sur des
jeux de données plus ou moin petit. Lorsque le volume de données
devient considérable, et surtout si le nombre de valeurs distinctes
reste significativement petit comparer à l'ensemble des données, la
deuxième technique peut s'avérer plus rapide et plus efficace.
Technique de l'APPLY
En reprenant l'exemple lors de la
technique par numérotation, la technique du cross apply consiste à
utiliser l'opérateur APPLY pour calculer le top 3 des meilleur
vendeurs selon l'année présente dans un premier jeu de données.
Pour commencer, il faut se construire
un jeu de données qui ne contient que les valeurs distinctes qui
constituent notre groupe de données distinct.
Avec ce petit jeu de données, on
applique l'opérateur APPLY pour calculer le top 3 des meilleurs
vendeurs selon l'année.
Cette requête prends un temps
d'exécution considérable, compte tenu du temps d'exécution de la
première technique. On peut améliorer ce temps d'exécution en se
créant une table commune pour réduire le nombre d'enregistrements
qui appelleront l'opérateur APPLY.
Avec cette nouvelle version, le temps
d'exécution s'est grandement amélioré pour rejoindre celui de la
première technique.
Mais peu importe la technique que vous
utilisez, il restera important tester la performance en fonction de
votre jeu de données.
Références: