Я имеют следующую таблицу в Teradata:
ranked | data_val
-------- ----------
1 | 100
2 | 30
2 | 20
2 | 70
Я составляю хочу следующую таблицу, где avg_val
— скользящее среднее значений data_val
, упорядоченных по возрастанию ranked
значений:
ranked | avg_val
------ ---------
1 | 100
2 | 55
Я пытаюсь использовать:
SELECT
ranked
, AVERAGE(data)val) OVER (
PARTITION BY NULL
ORDER BY ranked ASC
ROWS UNBOUNDED PRECEDING
) AS avg_val
FROM tbl
;
но я получаю это:
ranked | avg_val
------ ---------
1 | 100
2 | 65
2 | 50
2 | 55
чего я не хочу.
Как вернуть желаемый результат?
Как насчет агрегации с оконными функциями?
select ranked,
(sum(sum(data_val)) over (order by ranked rows between unbounded preceding and current row) /
sum(count(*)) over (order by ranked rows between unbounded preceding and current row)
)
from t
group by ranked;
@ Сэм. . . Аргх. Teradata еще не исправила это. Я добавил пункт окна.
Не волнуйтесь. У меня пока недостаточно репутации переполнения стека, чтобы показать голосование, но будьте уверены, за вас проголосовали.
Не использовать по умолчанию RANGE unbounded preceding
по историческим причинам (и range
не поддерживается в Teradata), но explixit ROWS unbounded preceding
в любом случае рекомендуется из-за возможной лучшей производительности (и потенциально неожиданного результата для неуникального порядка)
@dnoeth . . . Ой. По умолчанию должно быть range
, но Teradata не поддерживает это. Таким образом, для выражения конструкции rows
требуется предложение окна. В этом действительно есть смысл.
Пару раз требуется ROWS UNBOUNDED PRECEDING, но это работает.
select ranked, sum(sum(data_val)) over (order by ranked ROWS UNBOUNDED PRECEDING) / sum(count(*)) over (order by ranked ROWS UNBOUNDED PRECEDING) from tbl group by ranked;