Você pode precisar calcular a mediana de um conjunto de números, como vendas, etc., para encontrar o valor de transação típico de uma variável. Você precisa calcular a mediana no MySQL usando consultas SQL, pois não há função para isso. Aqui está uma consulta simples para calcular a mediana no MySQL.
Como calcular a mediana no MySQL
Aqui estão os passos para calcular a mediana no MySQL. Digamos que você tenha a seguinte tabela
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 | +------+------------+-------+
Digamos que você queira encontrar a pontuação mediana para a tabela. Mediana é o valor do item do meio em uma matriz de números que foi classificada. Se a matriz tiver um número par de itens, a mediana será a média dos 2 valores do meio.
Calcular mediana no MySQL
Aqui está a consulta SQL para calcular a mediana para a coluna de pontuação
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 | +------------+
Vejamos a consulta acima em detalhes. Usamos uma subconsulta SQL neste caso. A consulta interna atribui @rownum como índice incremental e classifica os valores selecionados. No final da primeira passagem, @total_rows conterá a contagem de linhas das linhas selecionadas. A consulta externa usa @total_rows para determinar a mediana, independentemente de haver um número par ou ímpar de valores.
Calcular mediana no MySQL após aplicar o filtro
Digamos que você queira calcular a mediana apenas para valores maiores que 80 (>80). Você pode fazer isso simplesmente adicionando uma cláusula where à sua consulta acima, conforme mostrado abaixo (condição de filtro mencionada em negrito )
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 | +------------+
Como traçar a linha mediana no gráfico/relatório
Digamos que você queira exibir o valor médio junto com os valores de dados secundários em seu relatório. Nesse caso, você pode simplesmente fazer uma junção cruzada de sua tabela de resultados medianos com sua tabela de dados original, conforme mostrado abaixo.
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 | +------+------------+-------+------------+
Na consulta acima, fizemos uma junção cruzada entre exames tabela com o resultado da consulta mediana (rotulada como temp )
Aqui está um exemplo dos dados acima plotados em um gráfico de linhas, criado usando Ubiq.
Você pode personalizar as consultas acima conforme sua necessidade para calcular a mediana no MySQL. Para sua informação, o MariaDB fornece uma função pronta para uso MEDIAN() para calcular a mídia para uma coluna de valores.
Se você deseja criar gráficos, painéis e relatórios do banco de dados MySQL, experimente o Ubiq. Oferecemos um teste gratuito de 14 dias.