SQL Количество, сколько выбросов в группе по - PullRequest
0 голосов
/ 28 ноября 2018

Я бы хотел посчитать, сколько элементов в каждом group by больше, чем $ \ mu + \ sigma $, $ \ mu + 2 \ sigma $ и т. Д.

Пока я нашел решениесначала создаю таблицу gp с $ \ mu $ и $ \ sigma $

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 голосов
/ 28 ноября 2018

Используйте оконные функции:

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;

Со статистической точки зрения вы должны смотреть и на нижнюю границу.Если распределение искажено только в положительном направлении, то стандартное отклонение может быть не самым лучшим показателем (хотя у вас нет большого выбора при использовании баз данных).

...