Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изчислим медиана в MySQL

Може да се наложи да изчислите медиана на набор от числа, като продажби и т.н., за да намерите типичната стойност на транзакцията на променлива. Трябва да изчислите медианата в MySQL с помощта на SQL заявки, тъй като няма функция за това. Ето една проста заявка за изчисляване на медиана в MySQL.

Как да изчислим медиана в MySQL

Ето стъпките за изчисляване на медиана в MySQL. Да приемем, че имате следната таблица

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  |
+------+------------+-------+

Да кажем, че искате да намерите средния резултат за таблицата. Медианата е стойността на средния елемент в масив от числа, който е бил сортиран. Ако масивът има четен брой елементи, тогава медианата е средната стойност на средните 2 стойности.

Изчислете медиана в MySQL

Ето SQL заявката за изчисляване на медиана за колоната с резултати

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   |
+------------+

Нека разгледаме по-подробно горната заявка. В този случай използваме SQL подзаявка. Вътрешната заявка присвоява @rownum като инкрементален индекс и сортира избраните стойности. В края на първото преминаване @total_rows ще съдържа броя на избраните редове. Външната заявка използва @total_rows за определяне на медианата, независимо дали има нечетен или четен брой стойности.

Изчислете медианата в MySQL след прилагане на филтър

Да приемем, че искате да изчислите медиана само за стойности, които са по-големи от 80 (>80). Можете да направите това, като просто добавите клауза where към вашата заявка по-горе, както е показано по-долу (условие на филтъра, споменато в удебелен )

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   |
+------------+

Как да начертая средната линия на графика/отчет

Да приемем, че искате да покажете средната стойност заедно със стойностите на страничните данни във вашия отчет. В този случай можете просто да направите кръстосано свързване на вашата таблица с медианни резултати с вашата оригинална таблица с данни, както е показано по-долу.

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  |
+------+------------+-------+------------+

В горната заявка направихме кръстосано свързване междуизпити таблица с резултата от средната заявка (означена като temp )

Ето пример за горните данни, нанесени на линейна диаграма, създадена с помощта на Ubiq.

Можете да персонализирате горните заявки според вашите изисквания за изчисляване на медиана в MySQL. За Ваше сведение, MariaDB предоставя готова функция MEDIAN() за изчисляване на медиите за колона от стойности.

Ако искате да създавате диаграми, табла за управление и отчети от MySQL база данни, можете да опитате Ubiq. Предлагаме 14-дневен безплатен пробен период.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стойността на часовата зона на сървъра „AEST“ е неразпозната или представлява повече от една часова зона

  2. Автоматично генериране на диаграма на база данни MySQL

  3. Проблеми с типовете съдържание при зареждане на устройство в Django

  4. Клъстерни ресурси на Galera

  5. Как да декларирам променлива в MySQL?