Начиная с MariaDB 10.3.3 существует функция MEDIAN
. К сожалению, есть небольшая проблема, когда я пытаюсь использовать его с оператором GROUP BY
(в настоящее время используется версия 10.3.9).
Учитывая следующую таблицу:
CREATE TABLE testmed
(
id INT NOT NULL auto_increment,
PRIMARY KEY(id),
group_id INT NOT NULL DEFAULT 0,
score INT NOT NULL DEFAULT 0
);
Заполняем его некоторыми данными:
INSERT INTO testmed (group_id, score)
VALUES (1,1), (1,2), (1,2), (1,2), (1,3), (2,5), (2,7), (2,9), (2,11), (2,11);
Теперь я получаю разные результаты с GROUP BY
в запросе и без него:
MariaDB [test]> SELECT group_id, score, MEDIAN(score) OVER (PARTITION BY group_id) FROM testmed; +----------+-------+--------------------------------------------+ | group_id | score | MEDIAN(score) OVER (PARTITION BY group_id) | +----------+-------+--------------------------------------------+ | 1 | 1 | 2.0000000000 | | 1 | 2 | 2.0000000000 | | 1 | 2 | 2.0000000000 | | 1 | 2 | 2.0000000000 | | 1 | 3 | 2.0000000000 | | 2 | 5 | 9.0000000000 | | 2 | 7 | 9.0000000000 | | 2 | 9 | 9.0000000000 | | 2 | 11 | 9.0000000000 | | 2 | 11 | 9.0000000000 | +----------+-------+--------------------------------------------+ 10 rows in set (0.000 sec)
MariaDB [test]> SELECT group_id, score, MEDIAN(score) OVER (PARTITION BY group_id) FROM testmed GROUP BY group_id; +----------+-------+--------------------------------------------+ | group_id | score | MEDIAN(score) OVER (PARTITION BY group_id) | +----------+-------+--------------------------------------------+ | 1 | 1 | 1.0000000000 | | 2 | 5 | 5.0000000000 | +----------+-------+--------------------------------------------+
Первый правильный, но почему он не работает должным образом с GROUP BY
. В настоящее время я использую вложение запросов следующим образом:
MariaDB [test]> SELECT * FROM (SELECT group_id, score, MEDIAN(score) OVER (PARTITION BY group_id) FROM testmed) t GROUP BY group_id; +----------+-------+--------------------------------------------+ | group_id | score | MEDIAN(score) OVER (PARTITION BY group_id) | +----------+-------+--------------------------------------------+ | 1 | 1 | 2.0000000000 | | 2 | 5 | 9.0000000000 | +----------+-------+--------------------------------------------+ 2 rows in set (0.000 sec)
но так неправильно делать это таким образом.
Как правильно это сделать?