我试图通过标准偏差消除SQL Server 2008中的异常值。我希望只有包含特定列中值的记录在该列平均值的+/- 1标准差内。
我该如何做到这一点?
答案 0 :(得分:16)
如果您假设事件的钟形曲线分布,那么只有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
答案 1 :(得分:4)
SQL中有一个名为STDEV的聚合函数,它将为您提供标准偏差。这是困难的部分 - 然后只需找到平均值和+/-一个STDEV值之间的范围。
这是你可以做的一种方式 -
create table #test
(
testNumber int
)
INSERT INTO #test (testNumber)
SELECT 2
UNION ALL
SELECT 4
UNION ALL
SELECT 4
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 5
UNION ALL
SELECT 7
UNION ALL
SELECT 9
SELECT testNumber FROM #test t
JOIN (
SELECT STDEV (testnumber) as [STDEV], AVG(testnumber) as mean
FROM #test
) X on t.testNumber >= X.mean - X.STDEV AND t.testNumber <= X.mean + X.STDEV
答案 2 :(得分:0)
我要小心并考虑你在做什么。抛弃异常值可能意味着您丢弃的信息可能不适合预先构思的世界观,这可能是完全错误的。那些异常值可能是罕见的“黑天鹅”,虽然不像你想象的那么罕见,而且非常重要。
您没有提供您正在做的事情的背景或解释。引用满足您特定案例需求的功能或技术很容易,但我认为在提供其他信息之前发布警告是合适的。