Un moyen simple de calculer la médiane dans MySQL
P粉960525583
2023-08-20 18:05:23
<p>Quel est le moyen le plus simple (et, espérons-le, pas trop lent) de calculer la médiane à l'aide de MySQL ? J'ai utilisé <code>AVG(x)</code> pour trouver la moyenne, mais j'ai du mal à trouver un moyen simple de calculer la médiane. Actuellement, je renvoie toutes les lignes à PHP, je les trie, puis je sélectionne les lignes du milieu, mais il doit y avoir 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 par <code>val</code> nous obtenons <code>2 2 3 4 7 8 9</code>, donc la médiane doit être <code>4</code>, et non < ;code>SELECT AVG(val)</code> est égal à <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 l'index est utilisé pour le filtrage et le tri. Valider via le plan d’exécution.
Calculez le numéro de ligne « médian ». Peut être utilisé :
median_row = floor(count / 2)
.Puis sélectionnez dans la liste :
Cela devrait renvoyer la valeur souhaitée.
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 jointure n'est requise.
De plus,
AVG(dd.val)
和dd.row_number IN(...)
est utilisé pour calculer correctement la médiane lorsque le nombre d'enregistrements est pair. Le raisonnement est le suivant :Enfin, MariaDB 10.3.3+ inclut la fonction MEDIAN