SQL计算一个组中有多少离群值

时间:2018-11-28 20:23:53

标签: sql amazon-redshift

我想计算每个group by中有多少个元素大于$ \ mu + \ sigma $,$ \ mu + 2 \ sigma $等。

到目前为止,我找到了一个解决方案,该解决方案首先使用$ \ mu $和$ \ sigma $

创建表gp
CREATE TABLE gp AS
SELECT col_a,
       col_b,
       AVG(y) AS y_mean,
       STDDEV(y) AS y_std
FROM my_table
GROUP BY col_a, col_b;

然后我对原始表格进行left join并通过

进行计数
SELECT col_a,
       col_b,
       SUM(CASE
             WHEN y>y_mean+y_std THEN 1
             ELSE 0
           END) AS std1,
       SUM(CASE
             WHEN y>y_mean+2*y_std THEN 1
             ELSE 0
           END) AS std2,
       SUM(CASE
             WHEN y>y_mean+3*y_std THEN 1
             ELSE 0
           END) AS std3, 
FROM (
SELECT a.*,
       b.y_mean,
       b.y_std
FROM(
(SELECT col_a,
       col_b,
       y
FROM my_table) a
LEFT JOIN (SELECT * FROM gp) b
ON a.col_a=b.col_a AND a.col_b=b.col_b)
)
GROUP BY col_a, col_b

我想知道是否有更有效的方法来达到相同的结果。

1 个答案:

答案 0 :(得分:1)

使用窗口功能:

SELECT col_a, col_b,
       SUM(CASE WHEN y > y_mean + y_std THEN 1 ELSE 0
           END) AS std1,
       SUM(CASE WHEN y > y_mean + 2 * y_std THEN 1 ELSE 0
           END) AS std2,
       SUM(CASE WHEN y > y_mean + 3 * y_std THEN 1 ELSE 0
           END) AS std3
FROM (SELECT t.*,
             AVG(y) OVER (PARTITION BY col_a, col_b) as y_mean,
             STDDEV(y) OVER (PARTITION BY col_a, col_b) as y_std
      FROM my_table t
     ) t
GROUP BY col_a, col_b;

从统计角度看,您也应该关注下限。如果分布仅在正方向上倾斜,则标准偏差可能不是最佳度量(尽管使用数据库时您没有太多选择)。