在MySQL中计算列的简单中间值

在MySQL中计算列的简单中间值,mysql,mariadb,Mysql,Mariadb,我正在努力找到一个简单的中值问题的解决方案。给定一个只有一列的表my_表: my_column | ----------| 10 | 20 | 30 | 40 | 50 | 60 | 如何调用函数返回35的中值 当我只想返回中间值时,我不知道如何使用此语法: SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTI

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

my_column | 
----------|
10        |
20        |
30        |
40        |
50        |
60        |
如何调用函数返回35的中值

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

SELECT
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY my_column) OVER ( PARTITION BY my_column)
FROM
  my_table
你可以尝试:

选择col_中位数 从…起 按“我的”列选择组顺序中的百分比0.5作为列中位数 从我的桌子上 T 限值1; 注:PERCENTILE_CONT函数是一个窗口函数,在这种情况下,其输出只能在扫描整个列后确定。因此,上面子查询的输出实际上是您的列以及一个新列,在所有行中具有相同的中值。但是,由于您只想将中位数报告为单个数字,因此我使用LIMIT 1外部查询来获取单个中位数值。

您可以尝试:

选择col_中位数 从…起 按“我的”列选择组顺序中的百分比0.5作为列中位数 从我的桌子上 T 限值1;
注:PERCENTILE_CONT函数是一个窗口函数,在这种情况下,其输出只能在扫描整个列后确定。因此,上面子查询的输出实际上是您的列以及一个新列,在所有行中具有相同的中值。但是,由于您只想将中位数报告为单个数字,因此我使用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中借用了该方法,但将其改编为MySQL 8.0 CTE和窗口函数。

以下是我在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和窗口函数中借用了该方法,但对其进行了调整。

我只会使用distinct,并带有一个空OVER子句:

我将使用distinct,并带有一个空OVER子句:


35是平均数,而不是中位数。@BillKarwin一点也不正确。上述数据集没有单个中值,因为它有偶数个值。因此,统计人员通常会报告30和40的平均值作为中位数。在这种情况下,它是35,这恰好也是平均值。我收回我的评论对不起,我应该使用更好的样本数据来保持更清晰!收回评论的一种方法是删除它。35是平均值,而不是中位数。@BillKarwin一点也不正确。上述数据集没有单个中值,因为它有偶数个值。因此,统计人员通常会报告30和40的平均值作为中位数。在这种情况下,它是35,这恰好也是平均值。我收回我的评论对不起,我应该使用更好的样本数据来保持更清晰!收回评论的一种方法是删除它。太好了!如果我也想得到0.25、0.50、0.75、0.90个百分位数,我会遵循同样的模式吗?对于整个表格,是的,这应该可以通过我的演示链接进行尝试。完美!如果我也想得到0.25、0.50、0.75、0.90个百分位数,我会遵循同样的模式吗?对于整个表格,是的,这应该可以通过我的演示链接进行尝试。