【发布时间】:2018-10-31 21:49:57
【问题描述】:
从 MariaDB 10.3.3 开始,存在 MEDIAN 函数。
不幸的是,当我尝试将它与GROUP BY 语句一起使用时出现了一个小问题(目前使用的是v10.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 |分数 | 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 行一组(0.000 秒)
MariaDB [test]> SELECT group_id, score, MEDIAN(score) OVER (PARTITION BY group_id) FROM testmed GROUP BY group_id; +----------+-------+------------------------------ --------------+ | group_id |分数 | 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 |分数 | MEDIAN(score) OVER (PARTITION BY group_id) | +----------+-------+------------------------------ --------------+ | 1 | 1 | 2.0000000000 | | 2 | 5 | 9.0000000000 | +----------+-------+------------------------------ --------------+ 2 行(0.000 秒)
但这样做感觉很不对。
什么是正确的做法?
【问题讨论】: