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 * * * * *
je partage totalement ton point de vue sur qu’il faut toujours tester d’abord avant d’opter pour un choix ou un autre selon le contexte.
A+
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 !
Rien ne vaut un test comparé des deux méthodes.
Un test semblable à celle décrite ci-dessous peut permettre de départager :
http://sqlpro.developpez.com/optimisation/mediane/LaMedianeEnSQL.pdf
A+