sql - 在 SQL Server 中通过标准差消除异常值

标签 sql sql-server sql-server-2008 statistics

我正在尝试通过标准差消除 SQL Server 2008 中的异常值。我只想要特定列中包含该列平均值 +/- 1 标准差范围内的值的记录。

我怎样才能做到这一点?

最佳答案

如果您假设事件呈钟形曲线分布,则只有 68% 的值与平均值相差 1 个标准差以内(95% 的值包含 2 个标准差)。

我将加载一个具有范围标准差的变量(使用 stdev / stdevp sql 函数导出),然后选择适当数量的标准差内的值。

declare @stdtest table (colname varchar(20), colvalue int)

insert into @stdtest (colname, colvalue) values ('a', 2)
insert into @stdtest (colname, colvalue) values ('b', 4)
insert into @stdtest (colname, colvalue) values ('c', 4)
insert into @stdtest (colname, colvalue) values ('d', 4)
insert into @stdtest (colname, colvalue) values ('e', 5)
insert into @stdtest (colname, colvalue) values ('f', 5)
insert into @stdtest (colname, colvalue) values ('g', 7)
insert into @stdtest (colname, colvalue) values ('h', 9)

declare @std decimal
declare @mean decimal
declare @lower decimal
declare @higher decimal
declare @noofstds int

select @std = STDEV(colvalue), @mean = AVG(colvalue) from @stdtest

--68%
set @noofstds = 1
select @lower = @mean - (@noofstds * @std)
select @higher = @mean + (@noofstds * @std)

select @lower, @higher, * from @stdtest where colvalue between @lower and @higher

--returns rows with a colvalue between 3 and 7 inclusive

--95%
set @noofstds = 2
select @lower = @mean - (@noofstds * @std)
select @higher = @mean + (@noofstds * @std)

select @lower, @higher, * from @stdtest where colvalue between @lower and @higher

--returns rows with a colvalue between 1 and 9 inclusive

关于sql - 在 SQL Server 中通过标准差消除异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077348/

相关文章:

sql - Oracle SQL 中的组合查询

mysql - 涉及同一列的多个索引有用吗?

sql - 在 google cloud spanner 中查询数组

SQL,删除行尾逗号的出现

Sql 在每个分类中获取前 2 个结果

sql-server-2008 - SQL Server 2008 重新填充索引 "Update"选项

Mysql 5.6 不在子查询中使用索引

c# - 如何访问数据流脚本组件中现有的 ADO.NET 连接管理器

sql-server - 分区和最大值的慢查询性能问题

vb.net - 在 VB 窗体上显示 SQL 查询结果