SQL文で異常値をはじく集計

SQLにおいて以下のようなテーブルがあります

tablename:calctest

no, hiduke, valueA, valueB 1, 2000/01/01 00:00:00, 10, 21 1, 2000/01/01 00:00:10, 11, 22 1, 2000/01/01 00:00:20, 10, 24 2, 2000/01/01 00:00:30, 12, 20 2, 2000/01/01 00:00:40, 10, 22 2, 2000/01/01 00:00:50, 11, 23 2, 2000/01/01 00:01:00, 12, 24

以下続く

ここにたまに異常値が入ります

X, yyyy/MM/dd hh:mm:ss, 200, 20 X, yyyy/MM/dd hh:mm:ss, 14, 200

これらをはじいてNoごとに集計をかけたいです
まず、ゴリ押し感ありますが
valueAとvalueBにおいて上下5%ずつ(乗算なので正確には微妙にズレます)排除して取得を繰り返し
残ったものでnoごとに集計をかける、といったものを考えました

Select no, min(hiduke) as timeSt, avg(valueA), avg(valueB) From (select top (95) percent no, hiduke, valueA, valueB From (Select top (95) percent no, hiduke, valueA, valueB From (Select top (95) percent no, hiduke, valueA, valueB From (Select top (95) percent no, hiduke, valueA, valueB From calctest Where hiduke BETWEEN DATEADD(SECOND, -2000, GETDATE()) AND GETDATE() order by valueA asc) as tmp order by valueB asc) as tmp order by valueA desc) as tmp order by valueB desc) as tmp group by no order by no, timeSt

しかしよく考えると、これだとno毎とか関係なく
ただvalueが高いもの低いものを切り捨ててしまいます
うまくnoごとに上下の異常値を排除しながら集計をかけるような書き方はありませんでしょうか?

コメントを投稿

0 コメント