Bonjour,
J'ai besoin de calculer la médiane d'une colonne (note) d'une table (table1) et ce pour les 7 derniers jours glissants (colonne : date).
SGBD : MySQL
Merci de votre aide.
Bonjour,
J'ai besoin de calculer la médiane d'une colonne (note) d'une table (table1) et ce pour les 7 derniers jours glissants (colonne : date).
SGBD : MySQL
Merci de votre aide.
Il faut utiliser
Je ne sais si PERCENTILE... est disponible sous MySQmerde qui en es à peine à la norme SQL de 1992 par rapport à la concurrence...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY note) OVER (PARTITION BY DATE ROWS BETWEEN 3 PRECEDNING AND 3 FOLLOWING) AS NOTE_MEDIANE FROM T_NOTES
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Merci. Visiblement ça ne fonctionne pas :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP (ORDER BY NOTE)
OVER (PARTITION BY DAT' at line 1
J'ai aussi essayé :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT NOTE, PERCENTILE_DISC(.50) WITHIN GROUP (ORDER BY NOTE) OVER() AS MEDIANE FROM TABLE;
Mais pas mieux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT NOTE, PERCENTILE_CONT(.50) WITHIN GROUP (ORDER BY NOTE) OVER() AS MEDIANE FROM TABLE;
Aurais-tu une autre solution ?
J'ai trouvé une solution, mais il me manque un élément.
En fait j'y arrive avec deux requêtes :
// La première pour obtenir le nombre de lignes de la colonne :
Résultat : 57
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT CEIL(COUNT(*)/2) FROM TABLE;
// La seconde pour le calcul de la médiane :
Problème : Il me faut faire deux requêtes. Il faudrait imbriquer le premier SELECT dans la seconde requête dans le "LIMIT" pour n'avoir qu'une seule requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT MAX(NOTE) AS MEDIANE FROM (SELECT NOTE FROM TABLE ORDER BY NOTE LIMIT 57 ) x;
J'ai fais plusieurs tests sans succès pour imbriquer ces deux requêtes.
Une idée ?
Essayez :
Mais attention cela peut être faux dans beaucoup de cas…
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT MAX(NOTE) AS MEDIANE FROM (SELECT NOTE FROM TABLE ORDER BY NOTE LIMIT (SELECT CEIL(COUNT(*)/2) FROM TABLE))
je vous invite à lire le papier que j'ai écrit à ce sujet :
https://sqlpro.developpez.com/optimisation/mediane/
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
J'ai une erreur avec celle-ci :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT CEIL(COUNT(*)/2) FROM TABLE))' at line 4
Partager