计算 MySQL 中列的简单中位数
Calculating a simple median on a column in MySQL
我正在努力寻找一个简单的中值问题的解决方案。给定一个只有一列的 table my_table
:
my_column |
----------|
10 |
20 |
30 |
40 |
50 |
60 |
如何调用一个函数来 return 35 的中位数?
当我只想 return 中值时,我无法弄清楚如何使此语法起作用:
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
my_table
你可以试试:
SELECT col_median
FROM
(
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER () AS col_median
FROM my_table
) t
LIMIT 1;
注意:PERCENTILE_CONT
函数是一个window函数,在这种情况下,其输出只能在整个列被计算后才能确定扫描。结果,上面子查询的输出实际上是您的列,以及一个新列,在所有行中具有相同的中值。但是,由于您只想将中位数报告为单个数字,因此我使用 LIMIT 1
外部查询来获取该单个中值。
这是我在 MySQL 8.0 中测试的解决方案:
with ranked as (
select my_column,
row_number() over (order by my_column) as r,
count(my_column) over () as c
from my_table
),
median as (
select my_column
from ranked
where r in (floor((c+1)/2), ceil((c+1)/2))
)
select avg(my_column) from median
输出:
+----------------+
| avg(my_column) |
+----------------+
| 35.0000 |
+----------------+
我借用了 的方法,但将其改编为 MySQL 8.0 CTE 和 window 函数。
我只使用 distinct
,带有一个空的 OVER()
子句:
SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER () median
FROM my_table
我正在努力寻找一个简单的中值问题的解决方案。给定一个只有一列的 table my_table
:
my_column |
----------|
10 |
20 |
30 |
40 |
50 |
60 |
如何调用一个函数来 return 35 的中位数?
当我只想 return 中值时,我无法弄清楚如何使此语法起作用:
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
my_table
你可以试试:
SELECT col_median
FROM
(
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER () AS col_median
FROM my_table
) t
LIMIT 1;
注意:PERCENTILE_CONT
函数是一个window函数,在这种情况下,其输出只能在整个列被计算后才能确定扫描。结果,上面子查询的输出实际上是您的列,以及一个新列,在所有行中具有相同的中值。但是,由于您只想将中位数报告为单个数字,因此我使用 LIMIT 1
外部查询来获取该单个中值。
这是我在 MySQL 8.0 中测试的解决方案:
with ranked as (
select my_column,
row_number() over (order by my_column) as r,
count(my_column) over () as c
from my_table
),
median as (
select my_column
from ranked
where r in (floor((c+1)/2), ceil((c+1)/2))
)
select avg(my_column) from median
输出:
+----------------+
| avg(my_column) |
+----------------+
| 35.0000 |
+----------------+
我借用了 的方法,但将其改编为 MySQL 8.0 CTE 和 window 函数。
我只使用 distinct
,带有一个空的 OVER()
子句:
SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER () median
FROM my_table