2013-11-27 2 views
0

У меня есть поле в моей базе данных с именем «Значение», и мне нужно рассчитать скользящее среднее этого «значения».Как рассчитать скользящую среднюю?

В таблице представлен первичный ключ «индекс», который используется в качестве порядка сортировки для таблицы.

Существует несколько подходов к этой проблеме в широком поиске, но я нахожу ссылки на специальные пользовательские интерфейсы сервера, которые есть на некоторых серверах, чтобы выполнить это.

Есть ли такая функция в версии 10.1+ ADS?

+0

Поскольку я не могу найти ссылку на «скользящую среднюю», я думаю, вы имеете в виду «скользящую среднюю». Для ADS нет встроенной функции, и в ARC32 нет инструмента. –

ответ

1

Я думаю, что это довольно простое самостоятельное объединение. Присоединив таблицу к себе, вы можете установить условие соединения, чтобы каждое измерение (строка) было соединено с N предыдущими измерениями, затем выберите среднее значение этого и идентификатор группы по строке.

Как это:

create table T 
(
    id int identity(1,1) primary key, 
    value float 
) 
go 

-- Insert some test data 
declare @i int = 0 

while @i < 1200 
begin 
    -- something random + @i => rising trend 
    insert T values (@i + rand()*100); 
    set @i = @i + 1 
end 

-- Take a look at some of the data (optional) 
-- Chaotic, but there is an upwards trend in the values. 
select top 100 * from T 

-- Fetch sliding average (over 20 measurements) 
-- While it can fluctuate, the upwards tendency is now plain to see. 
declare @duration int = 20 

select 
    t1.id, 
    avg(t2.value) [Sliding average] 
from 
    T T1 
    join T T2 on T2.id between T1.id - @duration and T1.id 
where 
    t1.ID < 100 
group by 
    t1.id 

-- To see the basis for each average... 
select 
    t1.id [Group number], 
    t2.id [Measurement ID], 
    t2.value [Value] 
from 
    T T1 
    join T T2 on T2.id between T1.id - @duration and T1.id 
where 
    t1.ID < 100 
order by 
    t1.id, t2.id 

Было ли это то, что вы имели в виду?

+0

Кстати: если производительность является проблемой, возможно, это решение слишком далеко от оптимального. В конце концов, если вы считаете средние для измерений N и N + 1, большинство базовых значений идентичны. Вы могли бы вычесть вклад первого элемента и вместо этого добавить вклад следующего. Использование такого подхода «дифференциального обновления» может быть более быстрым. CTE, вероятно, может это сделать, но, предположительно, клиент получает эти данные, и было бы легко сделать это эффективно в коде клиента (императив!) Вместо этого, обрабатывая данные как поток. –

+0

+1 ADS не имеет CTE, но имеет процедурные функции, такие как 'WHILE',' DECLARE', 'SET' и т. Д. Таким образом, это должно работать в ADS, который адаптируется к синтаксису. –