Published on

August 5, 2012

Récupérer les coureurs les plus rapides dans chaque tranche d’âge dans SQL Server

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.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.