Calcul de la médiane en SQL : nouvelle requête

Venu d’un internaute qui à gardé l’anonymat (O. Comte) une autre solution. Je laisse les commentaires tels quels…

Voici une amélioration de votre requête de cacul de la médiane, spécifique à SQL Server :


WITH
tt AS
(SELECT STT_VALEUR AS VAL  
 FROM   T_STATISTIQUES_STT)
SELECT AVG(VAL)
FROM   (SELECT TOP(2-((SELECT COUNT(*) FROM tt) % 2)) VAL
        FROM   (SELECT TOP((SELECT COUNT(*) FROM tt)/2+1) VAL
                FROM   tt
                ORDER  BY VAL asc) AS T1
  ORDER BY VAL desc) AS T

Deux idées ont été utilisées. La première est cosmétique : au lieu du CASE N%2 … on utilise directement la division entière puisque le
résultat d’un count(*) est un entier.
La seconde est, dans le cas d’un nombre pair d’éléments, est de faire la moyenne du top 2 médian plutôt que des min et max qui obligent à
répéter la requête. Les performances, déjà excellentes en sont encore améliorées.

——–
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
* * * * * Enseignant au CNAM PACA et à l’ISEN à Toulon * * * * *

3 réflexions au sujet de « Calcul de la médiane en SQL : nouvelle requête »

  1. Avatar de OComteOComte

    Elle est effectivement plus rapide. Toutefois, il faut se méfier de ce genre de test quand vous incluez ce calcul dans une requête complexe : même si, unitairement, la méthode « Top » ou ma variante est plus rapide, j’ai eu la surprise de trouver la méthode « SQL:1999″ plus performante dans une requête complexe qui caculait et utilisait les médianes pour un grand nombre de valeurs.

    Moralité : Testez, testez et re-testez !

Laisser un commentaire