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

Използване на MEDIAN заедно с функциите MAX, MIN и AVG в MySQL

Можете да изчислите медианата с GROUP BY в MySQL, въпреки че няма вградена функция за медиана.

Разгледайте таблицата:

Acrington   200.00
Acrington   200.00
Acrington   300.00
Acrington   400.00
Bulingdon   200.00
Bulingdon   300.00
Bulingdon   400.00
Bulingdon   500.00
Cardington  100.00
Cardington  149.00
Cardington  151.00
Cardington  300.00
Cardington  300.00

За всеки ред можете да преброите броя на подобните елементи, които са по-малко. Можете също да преброите колко стойности са по-малки или равни:

name        v       <   <=
Acrington   200.00  0   2
Acrington   200.00  0   2
Acrington   300.00  2   3
Acrington   400.00  3   4
Bulingdon   200.00  0   1
Bulingdon   300.00  1   2
Bulingdon   400.00  2   3
Bulingdon   500.00  3   4
Cardington  100.00  0   1
Cardington  149.00  1   2
Cardington  151.00  2   3
Cardington  300.00  3   5
Cardington  300.00  3   5

Със заявка

SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
             , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
  FROM sale o

Средната стойност ще се получи, когато броят по-малко от или равно е половината от броя на елементите

  • Акрингтън има 4 елемента. Половината от това е 2, което е в диапазона 0..2 (съответстващ на 200.00) и също в диапазона 2..3 (съответстващ на 300.00)

  • Булингдън също има 4 елемента. 2 е в диапазона 1..2 (стойност 300,00) и 2..3 (стойност 400,00)

  • Кардингтън има 5 елемента. Стойността 2,5 е между 2 и 3, което съответства на Cardington 151.

Средната стойност е средната стойност на минималните и максималните стойности, върнати от:

SELECT cs.name,v
   FROM
   (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                 , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
      FROM sale o) cs JOIN
   (SELECT name,COUNT(1)*.5 as cn
      FROM sale
      GROUP BY name) cc ON cs.name=cc.name
 WHERE cn between ls and lse

Което дава:

Acrington   200.00
Acrington   200.00
Acrington   300.00
Bulingdon   300.00
Bulingdon   400.00
Cardington  151.00

Накрая можем да получим медианата:

SELECT name,(MAX(v)+MIN(v))/2 FROM
(SELECT cs.name,v
   FROM
   (SELECT name,v, (SELECT COUNT(1) FROM sale WHERE v<o.v AND name=o.name) as ls
                 , (SELECT COUNT(1) FROM sale WHERE v<=o.v AND name=o.name) as lse
      FROM sale o) cs JOIN
   (SELECT name,COUNT(1)*.5 as cn
      FROM sale
     GROUP BY name) cc ON cs.name=cc.name
 WHERE cn between ls and lse
 ) AS medians
GROUP BY name

Давам

Acrington   250.000000
Bulingdon   350.000000
Cardington  151.000000


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL получава липсващи идентификатори от таблицата

  2. MYSQL - Сравнете СЕГА() и дата в часовата зона на Париж в заявка

  3. Как да рестартирате отдалечен MySQL сървър, работещ на Ubuntu linux?

  4. Данните са твърде дълги за колона - защо?

  5. Прехвърлянията на отдалечена mySQL връзка не могат да се свържат с MySQL 4.1+, като се използва старата несигурна грешка при удостоверяване от XAMPP