удалить выбросы по группе в sql - PullRequest
0 голосов
/ 30 апреля 2018

В моем столбце в SQL Server я должен удалить выбросы для каждой группы отдельно. Вот мои столбцы

select
    customer, 
    sku,
    stuff, 
    action,
    acnumber,
    year
from
    mytable

Пример данных:

     customer sku year stuff action
-----------------------------------
1         1    2 2017    10      0
2         1    2 2017    20      1
3         1    3 2017    30      0
4         1    3 2017    40      1
5         2    4 2017    50      0
6         2    4 2017    60      1
7         2    5 2017    70      0
8         2    5 2017    80      1
9         1    2 2018    10      0
10        1    2 2018    20      1
11        1    3 2018    30      0
12        1    3 2018    40      1
13        2    4 2018    50      0
14        2    4 2018    60      1
15        2    5 2018    70      0
16        2    5 2018    80      1

Я должен удалить выброс из переменной вещи, но отдельно по группе customer+sku+year.

Все, что ниже 25-го процентиля и выше 75-процентного, следует считать выбросом, и этот принцип должен соблюдаться для каждой группы.

Как очистить набор данных для следующей работы?

Обратите внимание, что в этом наборе данных есть переменное действие (оно принимает значения 0 и 1). Это не групповая переменная, но выбросы должны быть удалены только для ZERO(0) категорий переменной действия.

на языке R это определяется как

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

new <- remove_outliers(vpg$stuff)
vpg=cbind(new,vpg)

1 Ответ

0 голосов
/ 30 апреля 2018

Примерно так, может быть:

DELETE mytable
WHERE PERCENT_RANK() OVER (PARTITION BY Department ORDER BY customer, sku, year ORDER BY stuff ) < .25 OR 
      PERCENT_RANK() OVER (PARTITION BY Department ORDER BY customer, sku, year  ORDER BY stuff ) > .75 
...