Предполагая, что мой подзапрос
дает несколько строк со столбцами (x, y), я хотел бы вычислить значение avg (абс (x-среднее) / y)
. где среднее
эффективно равно avg (x)
.
выбрать avg (abs (x-avg (x)) / y) как наклон из подзапроса
не удается, потому что я не могу вложить функции агрегирования. Я также не могу придумать способ вычислить среднее значение в подзапросе, сохранив исходный набор результатов. Функция avgdev в том виде, в котором она существует в других диалектах, мне точно не поможет, так что здесь я застрял. Вероятно, просто из-за отсутствия знаний sql - вычислить значение из набора результатов в постобработке легко.
Какая конструкция SQL могла бы мне помочь?
Редактировать: Версия сервера - 8.3.4. Здесь недоступны оконные функции с WITH
или OVER
.
Одним из вариантов, который я нашел, является использование временной таблицы:
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;
Но это излишество?
Не конечно, я правильно вас понял, но вы, возможно, ищете что-то вроде этого:
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), просто не учитывайте «разделение по», используя пустой овер: через ()