Lorsque vous travaillez avec une table contenant une liste de coureurs, leur temps de réalisation et leur âge, il peut être utile de récupérer les coureurs les plus rapides dans chaque tranche d’âge. Dans cet article, nous explorerons comment accomplir cette tâche en utilisant SQL Server.
Commençons par créer une table d’exemple appelée #Runners:
CREATE TABLE #Runners
(
Runner integer NOT NULL,
Time integer NOT NULL,
Age integer NOT NULL
)
INSERT INTO #Runners
SELECT 1, 10, 20 UNION ALL
SELECT 2, 15, 20 UNION ALL
SELECT 3, 11, 20 UNION ALL
SELECT 4, 12, 30 UNION ALL
SELECT 5, 18, 30 UNION ALL
SELECT 6, 9, 40 UNION ALL
SELECT 7, 16, 40 UNION ALL
SELECT 8, 13, 30
Pour récupérer les coureurs les plus rapides en général, nous pouvons simplement utiliser la clause SELECT TOP
:
SELECT TOP(2) *
FROM #Runners
ORDER BY Time
Cependant, si nous voulons récupérer les coureurs les plus rapides dans chaque tranche d’âge, nous devons utiliser la fonction de classement ROW_NUMBER()
avec une expression de table commune (CTE) :
WITH cteRunners AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Age ORDER BY Time) AS RowN
FROM #Runners
)
SELECT *
FROM cteRunners
WHERE RowN <= 2
ORDER BY Age, RowN
Dans la requête ci-dessus, nous partitionnons les données par la colonne Age
et les trions par la colonne Time
. La fonction ROW_NUMBER()
attribue un numéro unique à chaque ligne dans chaque groupe d’âge en fonction du temps. Nous filtrons ensuite les résultats pour inclure uniquement les 2 meilleurs coureurs dans chaque tranche d’âge.
Il est important de noter que bien que cette approche soit simple et efficace, elle peut ne pas être la plus efficace pour les grands ensembles de données. Le moteur doit lire chaque ligne dans la table et évaluer la fonction de numéro de ligne pour le filtrage, ce qui peut être intensif en ressources. Pour améliorer les performances, une approche alternative utilisant l’opérateur CROSS APPLY
et une table de dénombrement peut être utilisée :
WITH cteN AS (
SELECT number
FROM master..spt_values
WHERE type = 'p' AND number BETWEEN 0 AND 100
)
SELECT *
FROM cteN
CROSS APPLY (
SELECT TOP(2) *
FROM #RunnersBig
WHERE #RunnersBig.Age = cteN.number
ORDER BY Time
) AS runners
ORDER BY cteN.number, runners.Time
Dans cette approche, nous créons une table de dénombrement en utilisant la CTE cteN
puis utilisons l’opérateur CROSS APPLY
pour la joindre à la table #RunnersBig
. Cela nous permet de récupérer les 2 meilleurs coureurs dans chaque tranche d’âge de manière efficace.
Il convient de mentionner que les performances de ces requêtes peuvent varier en fonction de la taille de l’ensemble de données et des exigences spécifiques de votre application.
En conclusion, récupérer les coureurs les plus rapides dans chaque tranche d’âge dans SQL Server peut être réalisé en utilisant des fonctions de classement et des CTE. Bien que l’approche simple utilisant ROW_NUMBER()
et une CTE fonctionne bien pour les ensembles de données plus petits, l’approche alternative utilisant CROSS APPLY
et une table de dénombrement peut offrir de meilleures performances pour les ensembles de données plus grands.