表 Mariadb 上的 MEDIAN() window 函数
MEDIAN() window function on stable Maria DB
我需要执行 MEDIAN 计算作为查询的一部分。我的开发人员告诉我 Maria DB 10.3.3 可以做到这一点,但我的服务器管理员告诉我他们只能升级到 10.3.2,因为这是最新的稳定版本。我看到 10.3.3 已于 2017 年 12 月 23 日发布,它怎么仍然只是测试版?
无论如何,使用某种 MEDIAN 功能的最佳选择是什么?做子查询既丑又慢又消耗更多CPU.
您可以使用 window 函数。对于数值:
select avg(col)
from (select t.*
row_number() over (order by col) as seqnum,
count(*) over () as cnt
from t
) t
where seqnum in ( cnt / 2, (cnt + 1) / 2, (cnt + 2) / 2);
对于字符串或者日期,插值比较难,所以我简单推荐一下:
select col
from (select t.*
row_number() over (order by col) as seqnum,
count(*) over () as cnt
from t
) t
where seqnum in ( cnt / 2, (cnt + 1) / 2);
您可以查看 MariaDB downloads page 的最新稳定版本(当前为 10.4.11)。使用原生 median()
-function 会比自己计算更快。
我需要执行 MEDIAN 计算作为查询的一部分。我的开发人员告诉我 Maria DB 10.3.3 可以做到这一点,但我的服务器管理员告诉我他们只能升级到 10.3.2,因为这是最新的稳定版本。我看到 10.3.3 已于 2017 年 12 月 23 日发布,它怎么仍然只是测试版?
无论如何,使用某种 MEDIAN 功能的最佳选择是什么?做子查询既丑又慢又消耗更多CPU.
您可以使用 window 函数。对于数值:
select avg(col)
from (select t.*
row_number() over (order by col) as seqnum,
count(*) over () as cnt
from t
) t
where seqnum in ( cnt / 2, (cnt + 1) / 2, (cnt + 2) / 2);
对于字符串或者日期,插值比较难,所以我简单推荐一下:
select col
from (select t.*
row_number() over (order by col) as seqnum,
count(*) over () as cnt
from t
) t
where seqnum in ( cnt / 2, (cnt + 1) / 2);
您可以查看 MariaDB downloads page 的最新稳定版本(当前为 10.4.11)。使用原生 median()
-function 会比自己计算更快。