在MySQL中计算列的简单中间值
我正在努力找到一个简单的中值问题的解决方案。给定一个只有一列的表my_表:在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_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个百分位数,我会遵循同样的模式吗?对于整个表格,是的,这应该可以通过我的演示链接进行尝试。