sql >> Databasteknik >  >> RDS >> Mysql

Hur man beräknar median i MySQL

Du kan behöva beräkna medianen för en uppsättning siffror som försäljning etc för att hitta det typiska transaktionsvärdet för en variabel. Du måste beräkna median i MySQL med SQL-frågor eftersom det inte finns någon funktion för det. Här är en enkel fråga för att beräkna median i MySQL.

Hur man beräknar median i MySQL

Här är stegen för att beräkna median i MySQL. Låt oss säga att du har följande tabell

CREATE TABLE exams (
id int(11) NOT NULL auto_increment,
dt date,
score int,
PRIMARY KEY (id)
);

insert into exams (dt,score) values ('2019-01-01',70);
insert into exams (dt,score) values ('2019-02-01',77);
insert into exams (dt,score) values ('2019-03-01',71);
insert into exams (dt,score) values ('2019-04-01',70);

insert into exams (dt,score) values ('2019-05-01',89);
insert into exams (dt,score) values ('2019-06-01',87);
insert into exams (dt,score) values ('2019-07-01',88);
insert into exams (dt,score) values ('2019-08-01',89);

mysql> select * from exams;
+------+------------+-------+
| id   |     dt     | score |
+------+------------+-------+
|   1  | 2019-01-01 |   70  |
|   2  | 2019-02-01 |   77  |
|   3  | 2019-03-01 |   71  |
|   4  | 2019-04-01 |   70  |
|   5  | 2019-05-01 |   89  |
|   6  | 2019-06-01 |   87  |
|   7  | 2019-07-01 |   88  |
|   8  | 2019-08-01 |   89  |
+------+------------+-------+

Låt oss säga att du vill hitta medianpoängen för tabellen. Median är värdet på mittposten i en array av nummer som har sorterats. Om matrisen har ett jämnt antal objekt är medianen medelvärdet av de två mittersta värdena.

Beräkna median i MySQL

Här är SQL-frågan för att beräkna median för poängkolumnen

SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
  FROM exams d, (SELECT @rownum:=0) r
  WHERE d.score is NOT NULL
  -- put some where clause here
  ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

+------------+
| median_val |
+------------+
|    82.00   |
+------------+

Låt oss titta på ovanstående fråga i detalj. Vi använder en SQL-underfråga i detta fall. Den inre frågan tilldelar @rownum som inkrementellt index och sorterar de valda värdena. I slutet av första passet kommer @total_rows att innehålla radantalet för valda rader. Den yttre frågan använder @total_rows för att bestämma medianen, oavsett om det finns udda eller jämna antal värden.

Beräkna median i MySQL efter applicering av filter

Låt oss säga att du bara vill beräkna median för värden som är större än 80 (>80). Du kan göra det genom att helt enkelt lägga till en where-klausul i din fråga ovan, som visas nedan (filtervillkor anges i fetstil )

SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
  FROM exams d, (SELECT @rownum:=0) r
  WHERE d.score is NOT NULL
  AND d.score>80
  ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );

+------------+
| median_val |
+------------+
|    88.50   |
+------------+

Hur man ritar medianlinjen på grafen/rapporten

Låt oss säga att du vill visa medianvärdet vid sidan av datavärden i din rapport. I så fall kan du helt enkelt göra en korskoppling av din medianresultattabell med din ursprungliga datatabell, som visas nedan.

select * from exams,
(
SELECT AVG(dd.score) as median_val
FROM (
SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
 FROM exams d, (SELECT @rownum:=0) r
 WHERE d.score is NOT NULL
 -- put some where clause here
 ORDER BY d.score
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) )
) temp;

+------+------------+-------+------------+
| id   |     dt     | score | median_val |
+------+------------+-------+------------+
|   1  | 2019-01-01 |   70  |   82.0000  |
|   2  | 2019-02-01 |   77  |   82.0000  |
|   3  | 2019-03-01 |   71  |   82.0000  |
|   4  | 2019-04-01 |   70  |   82.0000  |
|   5  | 2019-05-01 |   89  |   82.0000  |
|   6  | 2019-06-01 |   87  |   82.0000  |
|   7  | 2019-07-01 |   88  |   82.0000  |
|   8  | 2019-08-01 |   89  |   82.0000  |
+------+------------+-------+------------+

I ovanstående fråga har vi gjort en korskoppling mellan prov tabell med resultatet av medianfrågan (märkt som temp )

Här är ett exempel på ovanstående data plottad på ett linjediagram, skapat med Ubiq.

Du kan anpassa ovanstående frågor enligt ditt krav för att beräkna median i MySQL. FYI, MariaDB tillhandahåller en out-of-the-box-funktion MEDIAN() för att beräkna media för en kolumn med värden.

Om du vill skapa diagram, instrumentpaneler och rapporter från MySQL-databasen kan du prova Ubiq. Vi erbjuder en 14-dagars gratis provperiod.

  1. Hur man ökar filstorleken för en datafil i SQL Server (T-SQL)

  2. Flera räkningar med olika villkor i en enda MySQL-fråga

  3. vad är ett bra sätt att horisontell shard i postgresql

  4. Hur man får identitetskolumnvärden utan att nämna identitetskolumnnamn i Select - SQL Server / T-SQL självstudie del 46