Un moyen simple de calculer la médiane avec MySQL
P粉720716934
2023-08-29 11:47:07
<p>Quel est le moyen le plus simple (pas trop lent, espérons-le) de calculer la médiane à l'aide de MySQL ? J'utilise <code>AVG(x)</code> pour trouver la moyenne, mais j'ai du mal à trouver un moyen simple de calculer la médiane. À l'heure actuelle, je renvoie toutes les lignes à PHP, je trie, puis je sélectionne les lignes du milieu, mais il doit exister un moyen simple de le faire dans une seule requête MySQL. </p>
<p>Exemples de données :</p>
<pre class="brush:php;toolbar:false;">id val |
---------
1 4
2 7
3 2
4 2
5 9
6 8
73≪/pré>
<p>Trier <code>val</code> donne <code>2 2 3 4 7 8 9</code>, donc la médiane doit être <code>4</code>, et <code> ;SELECT AVG(val)</code> == <code>5</code>. </p>
Je viens de trouver une autre réponse en ligne 一> dans les commentaires :
Assurez-vous que vos colonnes sont bien indexées et que les index sont utilisés pour le filtrage et le tri. Validez avec le plan d'explication.
Calculez le numéro de ligne « médian ». Peut-être utiliser :
median_row = Floor(count / 2)
.Puis sélectionnez-le dans la liste :
Cela devrait renvoyer une ligne avec les valeurs souhaitées.
Dans MariaDB / MySQL :
Steve Cohen a souligné qu'après le premier passage, @rownum contiendra le nombre total de lignes. Cela peut être utilisé pour déterminer la médiane, donc aucune seconde passe ou concaténation n’est requise.
De plus,
AVG(dd.val)
和dd.row_number IN(...)
est utilisé pour générer correctement la médiane lorsqu'il y a un nombre pair d'enregistrements. Raisonnement :Enfin, MariaDB 10.3.3+ inclut la fonction MEDIAN