Come posso trovare il valore mediano di una colonna in MySQL?


10

Posso solo immaginare di farlo con due query sul database. Il primo trova il numero di righe nel database e il secondo seleziona con un ORDER BYsulla colonna che mi interessa e LIMIT X, 1dove X è la metà del numero di righe.

C'è un modo semplice per farlo con una sola query?

In questo momento sto usando le medie nei miei calcoli, ma penso che la media sarebbe migliore; non c'è limite superiore ai valori e questi sono limitati dal basso di 0.


EDIT: sì, volevo dire "mediana" ma avevo qualche errore cerebrale e cercavo "cattiva". Ora ho trovato la risposta su StackOverflow


Dopo aver letto metaper un po 'sembra che ci sia una divisione per resistere a questa domanda dovrebbe essere qui o in SO. Riconosco che questa potrebbe non essere una query a livello di ninja , ma mi ha lasciato perplesso e non c'è DBA nella società per cui lavoro (6 persone in totale).
JIStone

Risposte:


6

C'è un bel po 'di discussione qui sul calcolo dei valori mediani da una tabella MySQL. Cerca nella pagina "mediana".

A parte questo, mi sembra che non ci sia alcuna funzione integrata per farlo. La mediana è spesso più descrittiva della tendenza centrale che della media. Access / VBA ha lo stesso buco nel suo elenco di funzioni.


Sono d'accordo. Quando si lavora in una query di grandi dimensioni, le linee extra rendono il tutto più ingombrante e difficile da eseguire il debug / mantenere.
JIStone,

2

Non ho visto una soluzione da nessuna parte che riesca a ottenere la mediana in una singola query. Non mi dispiace le tabelle temporanee, ma se non sono necessarie, fantastico! Ecco cosa mi è venuto in mente:

SELECT AVG(profit) median, nofitems FROM(
  SELECT x.profit, SUM(SIGN(1.0-SIGN(y.profit-x.profit))) diff, count(*) nofitems, floor(count(*)+1/2)
  FROM brand_prof x, brand_prof y
  GROUP BY x.profit
  HAVING SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = floor((COUNT(*)+1)/2)
      OR SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = ceiling((COUNT(*)+1)/2)
) x;

Ho provato questo per un set uniforme e ho ottenuto la risposta giusta. brand_prof ha solo due colonne: brand_name e profit, un valore decimale. Se si trattasse di valori interi, potrebbe essere necessario eseguire il cast "ceiling ((CAST COUNT (*) AS DECIMAL) ..." Più di quello che ho testato. L'idea geniale di utilizzare un prodotto cartesiano e mettere in relazione la somma dei segni era non mio. Purtroppo ho dimenticato l'autore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.