Може да се наложи да изчислите медиана на набор от числа, като продажби и т.н., за да намерите типичната стойност на транзакцията на променлива. Трябва да изчислите медианата в 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-дневен безплатен пробен период.