计算 MySQL 中列的简单中位数

Tom*_*ssi 7 mysql sql median common-table-expression mariadb

我正在努力寻找一个简单的中值问题的解决方案。my_table给定一个只有一列的表:

my_column | 
----------|
10        |
20        |
30        |
40        |
50        |
60        |
Run Code Online (Sandbox Code Playgroud)

如何调用函数返回中位数 35?

当我只想返回中值时,我不知道如何使此语法起作用:

SELECT
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
  my_table
Run Code Online (Sandbox Code Playgroud)

Bil*_*win 5

这是我在 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
Run Code Online (Sandbox Code Playgroud)

输出:

+----------------+
| avg(my_column) |
+----------------+
|        35.0000 |
+----------------+
Run Code Online (Sandbox Code Playgroud)

我借用了/sf/answers/508474781/的方法,但将其改编为MySQL 8.0 CTE和窗口函数。


GMB*_*GMB -1

我只想使用distinct, 和一个空OVER()子句:

SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER () median
FROM my_table
Run Code Online (Sandbox Code Playgroud)