Sql 按修剪平均数划分的研究生组
我是SQL的新手,目前正在使用具有以下结构的数据集:-Sql 按修剪平均数划分的研究生组,sql,postgresql,Sql,Postgresql,我是SQL的新手,目前正在使用具有以下结构的数据集:- col1 col2 val id A B 10 1 B C 20 1 A B 30 2 B D 5 2 我想得到每组(col1,col2)val的修剪平均值(5%),以及val大于该组的修剪平均值的各组的总病例数。修剪后的平均值应该与scipy.stats.trim\u mean()函数返回的值匹配 我使用下面的代码计算每组的下限和上限 with b
col1 col2 val id
A B 10 1
B C 20 1
A B 30 2
B D 5 2
我想得到每组(col1,col2)val的修剪平均值(5%),以及val大于该组的修剪平均值的各组的总病例数。修剪后的平均值应该与scipy.stats.trim\u mean()函数返回的值匹配
我使用下面的代码计算每组的下限和上限
with bounds as (
select
avg(extract(epoch from val)) - 2 * stddev(extract(epoch from val)) as lower_bound,
avg(extract(epoch from val)) + 2 * stddev(extract(epoch from val)) as upper_bound
from {table})
select * from bounds
但是我不确定如何在col1
和col2
上使用这段代码以及groupby
有没有关于如何获取postgres中所有聚合值的想法
我想得到每组(col1,col2)val的修剪平均值(5%),以及val大于修剪平均值的每组中的值的数量
如果我理解正确,您可以使用窗口函数来计算组的平均值和标准偏差。我还假设修剪实际上是“在两个标准偏差之外”。如果你真的想排除最高值和最低值中的5%(或2.5%),那么我建议你问一个新问题——并且一定要解释在有联系时该怎么做
然后汇总:
select col1, col2,
avg(val) filter (where val between avg_val - 2 * stddev_val and avg_val + 2 * stddev_val) as trimmed_mean,
count(*) filter (where val not between avg_val - 2 * stddev_val and avg_val + 2 * stddev_val) as extemes
from (select t.*,
avg(val) over (partition by col1, col2) as avg_val,
stddev(val) over (partition by col1, col2) as stddev_val
from t
) t
group by col1, col2;
注意:我没有使用extract()
因为示例数据看起来像一个数字。如果它确实是日期/时间数据,您可以将其添加到查询中。我使用了extract
,因为val列的类型是interval。我在列类型interval上使用stddev时遇到问题。使用extract解决了我的问题。不过,感谢您的帮助!我将尝试运行此命令然后看看它是否适合我。:+1在顶级查询中,我们应该执行count(*)filter(其中val>trimmed_mean),但进行此更改会打断我的查询。有没有关于如何更改查询以便我可以用这种方式定义极端值的想法?@witchkingofagmar…这回答了所问的问题。如果您有其他问题,请提出新问题。