Мне нужно рассчитать разлагающееся среднее (совокупное перемещение?) Набора значений. Последнее значение в серии составляет 50% веса, с разложившимся средним значением всех предыдущих серий, как и другой вес 50%, рекурсивно.Рекурсивное распадение среднего на сервере Sql 2012
Я придумал запрос CTE, который дает правильные результаты, но зависит от последовательного номера строки. Мне интересно, есть ли лучший способ сделать это в SQL 2012, возможно, с новыми функциями окон для Over() или что-то в этом роде?
В данных в реальном времени строки упорядочены по времени. Я могу использовать представление SQL и ROW_NUMBER() для генерации необходимого поля Row для моего подхода CTE, но если есть более эффективный способ сделать это, я хотел бы сохранить это как можно более эффективным.
У меня есть таблица с двумя столбцами: строка int и значение Float. У меня 6 значений данных выборки 1,2,3,4,4,4. Правильный результат должен быть 3,78125.
Мое решение:
;WITH items AS (
SELECT TOP 1
Row, Value, Value AS Decayed
FROM Sample Order By Row
UNION ALL
SELECT v.Row, v.Value, Decayed * .5 + v.Value *.5 AS Decayed
FROM Sample v
INNER JOIN items itms ON itms.Row = v.Row-1
)
SELECT top 1 Decayed FROM items order by Row desc
Это правильно производит 3,78125 с тестовыми данными. Мой вопрос: есть ли более эффективный и/или более простой способ сделать это в SQL 2012, или это единственный способ сделать это? Благодарю.
Правильно ли рекурсивный результат CTE? В том, что первая строка распадается относительно относительно других строк? Если не удалить «iif» из моего ответа. –
Это правильно. Но первая строка не особо особенная. Результат для 1 элемента - это просто значение этого элемента. Добавьте второй элемент, результат предыдущего результата - 50%, а новое значение - 50%. Добавьте третье значение, затем предыдущий результат (из первых 2 элементов) равен 50%, а третий элемент - 50%. И так до конца серии. Последний элемент всегда равен 50%, а остальные 50% - предыдущий результат до добавления последнего элемента. – DaveInMaine
Хорошо, что это особенно важно, когда вы смотрите на сумму, которая в конечном итоге способствует окончательному итогу, это единственная строка, которая не в два раза больше, чем ее преемник. Потому что он не уменьшается вдвое до тех пор, пока второй ряд не вступит в игру, а вторая строка будет уменьшена вдвое. –