Медиана значений

 

Функция MEDIAN возвращает медиану набора данных. Медиана – это значение, которое делит набор данных на две равные половины.

Примечание

Поддерживается со сборки 6.0.17.92.

Синтаксические правила
  1. < Значимое выражение > в аргументе должно быть числовым типом данных или приводиться к нему.

Общие правила
  1. Тип данных результата:

    • DECIMAL, если тип аргументов INT, SMALLINT, BIGINT, DECIMAL;

    • DOUBLE, если тип аргументов REAL, DOUBLE.

  2. Функция применяется к набору значений, полученных из аргумента путем исключения NULL-значений, т.е. записи с NULL-значением не учитываются при подсчете записей.

    create or replace table test(i int);
    insert into test values(NULL),(2),(2),(2),(3);
    select median(distinct i) from test;
    
    |2.5 |
  3. В одном подзапросе с GROUP BY можно использовать только одну функцию MEDIAN. При нарушении указанного требования будет выдан код завершения 99 «Операция не реализована».

    create or replace table test(s int,i int, j char(10));
    insert into test values(1, 400, 'd'), (1, 1, 'a'), (2, 10, 'g'), (2, 1, 'b'), (1, 25, 'e');
    select s, median(i) from test group by s;
    
    |1 |25.0 |
    |2 |5.5  |

    Примечание

    Для учета записей с NULL-значением им надо явно присвоить значение. Например,

    select median(case i when NULL then 0 else i end) from tab1;

    или

    select median (nvl(i,0)) from tab1;
  4. Если указан DISTINCT, дубликаты значений исключаются из подсчета.

  5. Если функция применяется к пустому набору значений, результат NULL.

  6. Для определения медианы находится такое наибольшее значение, которое не превышает минимум половину всех значений выборки данных.

  7. Если набор данных содержит нечетное количество значений, медиана равняется одному значению, иначе медиана равняется усредненному значению двух средних значений.

Пример

Определить среднюю зарплату сотрудников отдела и медианное значение (медиана показывает, что одна половина сотрудников отдела получает зарплату меньше медианного значения, т.е. меньше 23500.0 руб., а другая половина – больше 23500.0 руб., в то время как в среднем они получают по 29250.0 руб.).

create or replace table payment(manager char(20), salary numeric);
insert into payment values('Иванов', 20000);
insert into payment values('Петров', 22000);
insert into payment values('Сидоров', 25000);
insert into payment values('Кац', 50000);
select avg(salary) as "AVG", median(salary) as "MEDIAN" from payment;

 AVG       MEDIAN
 ---      ------
|  29250.0|  23500.0|