我正在尝试通过标准差消除 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/