【问题标题】:remove outliers by group in sql在sql中按组删除异常值
【发布时间】:2018-10-10 15:41:57
【问题描述】:

在我的 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

我必须从 stuff 变量中删除异常值,但要按组 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)

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 你看过 Percentile Rank 函数吗? link
  • 您真正应该发布的是表定义、示例数据和所需的输出。百分位是什么?这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • @user1443098 你能把它用在我的数据上吗?
  • @ecp 我试着像在 R 语言中那样做,function(x, na.rm = TRUE, ...) { qnt (qnt[2] + H)]

标签: sql r sql-server data-science sqldf


【解决方案1】:

可能是这样的:

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 

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2020-11-17
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2020-08-19
    • 2021-10-23
    • 2020-08-08
    相关资源
    最近更新 更多