Как вычислить скользящее среднее по рангу (а не по строке) в Teradata?

Я имеют следующую таблицу в 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

чего я не хочу.

Как вернуть желаемый результат?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
315
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет агрегации с оконными функциями?

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;

Пару раз требуется 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;

Sam Y 15.05.2019 21:02

@ Сэм. . . Аргх. Teradata еще не исправила это. Я добавил пункт окна.

Gordon Linoff 15.05.2019 21:22

Не волнуйтесь. У меня пока недостаточно репутации переполнения стека, чтобы показать голосование, но будьте уверены, за вас проголосовали.

Sam Y 15.05.2019 22:04

Не использовать по умолчанию RANGE unbounded preceding по историческим причинам (и range не поддерживается в Teradata), но explixit ROWS unbounded preceding в любом случае рекомендуется из-за возможной лучшей производительности (и потенциально неожиданного результата для неуникального порядка)

dnoeth 15.05.2019 22:28

@dnoeth . . . Ой. По умолчанию должно быть range, но Teradata не поддерживает это. Таким образом, для выражения конструкции rows требуется предложение окна. В этом действительно есть смысл.

Gordon Linoff 15.05.2019 22:50

Другие вопросы по теме