T-SQL для нормализованного среднего - PullRequest
3 голосов
/ 21 июля 2011

Я ищу способ вычисления полезного среднего значения для данного набора значений, который может содержать огромные пики.(например, 21, 54, 34, 14, 20, 300, 23 или 1, 1, 1, 1, 200, 1, 100) шипы могут отбрасывать вещи при использовании стандартного среднего вычисления.

Iрассматривал использование медианы, но это не дает желаемого результата.

Я хотел бы реализовать это в T-SQL

Есть идеи?

Ответы [ 5 ]

1 голос
/ 21 июля 2011

Таким образом, вы можете убрать самый высокий и самый низкий 25% перед вычислением результата.

declare @t table (col1 int)

insert @t
select 21 union all 
select 54 union all 
select 34 union all 
select 14 union all 
select 20 union all 
select 300 union all 
select 23 union all 
select 1 union all 
select 1 union all 
select 1 union all 
select 1 union all 
select 200 union all 
select 1 union all 
select 100


select avg(col1) from (
select top 67 percent col1 from (
select top 75 percent col1 from @t order by col1
) a order by col1 desc) b
1 голос
/ 21 июля 2011

Использовать медианный фильтр:

SELECT  AVG(value)
FROM    (
        SELECT  TOP 1 value AS median
        FROM    (
                SELECT  TOP 50 PERCENT value
                FROM    mytable
                ORDER BY
                        value
                ) q
        ORDER BY
                value DESC
        ) q
JOIN    mytable m
ON      ABS(LOG10(value) - LOG10(median)) <= @filter_level
0 голосов
/ 05 июня 2013

Вы можете рассмотреть возможность использования оконной функции, такой как OVER / PARTITION BY. Это позволит вам точно настроить исключения в определенных группах строк (например, по имени, дате или часу). В этом примере я позаимствовал строки из примера t-clausen.dk и расширил их, добавив имя, чтобы мы могли продемонстрировать управление окнами. -- Set boundaries, like the TOP PERCENT used in the afore mentioned example DECLARE @UBOUND FLOAT, @LBOUND FLOAT</p> <p>SET @UBOUND = 0.8 --(80%) SET @LBOUND = 0.2 --(20%)</p> <p>--Build a CTE table ;WITH tb_example AS ( select [Val]=21,[fname]='Bill' union all select 54,'Tom' union all select 34,'Tom' union all select 14,'Bill' union all select 20,'Bill' union all select 300,'Tom' union all select 23,'Bill' union all select 1,'Tom' union all select 1,'Tom' union all select 1,'Bill' union all select 1,'Tom' union all select 200,'Bill' union all select 1,'Tom' union all select 12,'Tom' union all select 8,'Tom' union all select 11,'Bill' union all select 100,'Bill' )</p> <p>--Outer query applies criteria of your choice to remove spikes SELECT fname,AVG(Val) FROM ( -- Inner query applies windowed aggregate values for outer query processing SELECT * ,ROW_NUMBER() OVER (PARTITION BY fname order by Val) RowNum ,COUNT(*) OVER (PARTITION BY fname) RowCnt ,MAX(Val) OVER (PARTITION BY fname) MaxVal ,MIN(Val) OVER (PARTITION BY fname) MinVal FROM tb_example ) TB WHERE -- You can use the bounds to eliminate the top and bottom 20% RowNum BETWEEN (RowCnt*@LBOUND) and (RowCnt*@UBOUND) -- Limits window -- Or you may chose to simply eliminate the Max and MIN values OR (Val > MinVal AND Val < MaxVal) -- Removes Lowest and Highest values GROUP BY fname

В этом случае я использую оба критерия и AVG val по fname. Но небо - это предел того, как вы решили смягчать пики с помощью этой техники.

0 голосов
/ 21 июля 2011

Опасность при этом заключается в том, что вы не можете быть уверены, что все эти шипы незначительны и их стоит отбросить. Шум одного человека - это чёрный лебедь другого человека.

Если вас беспокоят большие значения, которые бесполезно искажают представление данных, вам лучше использовать меру, например медиану, которая менее чувствительна к выбросам. Его сложнее рассчитать, чем среднее, но он даст вам меру центральности, которая не так сильно колеблется из-за шипов.

0 голосов
/ 21 июля 2011
  1. Создать GROUP BY по логарифмическому правилу (например, разница между числом не превышает 10 раз или любой другой базе журнала)
  2. Создать фильтрацию (используя HAVING) по непредставительным группам (например, менее 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...