Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按修剪平均数划分的研究生组_Sql_Postgresql - Fatal编程技术网

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

我是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 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…这回答了所问的问题。如果您有其他问题,请提出新问题。