Избегайте вложения функций агрегирования в PostgreSQL 8.3.4

Предполагая, что мой подзапрос дает несколько строк со столбцами (x, y), я хотел бы вычислить значение avg (абс (x-среднее) / y) . где среднее эффективно равно avg (x) .

выбрать avg (abs (x-avg (x)) / y) как наклон из подзапроса не удается, потому что я не могу вложить функции агрегирования. Я также не могу придумать способ вычислить среднее значение в подзапросе, сохранив исходный набор результатов. Функция avgdev в том виде, в котором она существует в других диалектах, мне точно не поможет, так что здесь я застрял. Вероятно, просто из-за отсутствия знаний sql - вычислить значение из набора результатов в постобработке легко.

Какая конструкция SQL могла бы мне помочь?

Редактировать: Версия сервера - 8.3.4. Здесь недоступны оконные функции с WITH или OVER .

1
задан relet 25 August 2010 в 12:13
поделиться

2 ответа

Одним из вариантов, который я нашел, является использование временной таблицы:

begin; 
  create temporary table sub on commit drop as (...subquery code...);
  select avg(abs(x-mean)/y) as incline from (SELECT x, y, (SELECT avg(x) FROM sub) AS mean FROM sub) as sub2;
commit;

Но это излишество?

0
ответ дан 2 September 2019 в 21:51
поделиться

Не конечно, я правильно вас понял, но вы, возможно, ищете что-то вроде этого:

SELECT avg(x - mean/y)
FROM (
  SELECT x, 
         y, 
         avg(x) as mean over(partition by your_grouping_column) 
  FROM your_table
) t

Если вам не нужно группировать результаты, чтобы получить правильное значение avg (x), просто не учитывайте «разделение по», используя пустой овер: через ()

1
ответ дан 2 September 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: