Получить значения столбцов из нескольких строк в виде массива

Я пытаюсь получить значения столбцов в виде массива, чтобы использовать их в функции array_agg_transfn() для вычисления среднего значения как определено в Postgres Wiki.

Значения столбца определенного столбца я извлекаю на основе текущей строки. Например, на 13 строк ниже текущей строки. Я пробовал использовать следующий запрос:

select a."Week_value", 
       array_agg(a."Week_value") 
            over(order by prod_name,week_date desc 
                 rows between 0 preceding and 12 following) 
from vin_temp_table

Но появилось это сообщение об ошибке:

array_agg_transfn called in non-aggregate context

Можно ли построить массив из значений столбцов в следующих n строках?


person user2569524    schedule 24.02.2014    source источник
comment
Было бы очень полезно предоставить определение таблицы и некоторые примеры значений для вашего случая, в идеале в SQLfiddle (example) или что-то в этом роде. И исправьте свое утверждение, находясь в нем, ссылки на a недействительны.   -  person Erwin Brandstetter    schedule 24.02.2014


Ответы (2)


Это прекрасно работает с Postgres 9.3:

SELECT week_value
     , array_agg(week_value) OVER(ORDER BY prod_name, week_date DESC
                                  ROWS BETWEEN 0 PRECEDING AND 12 FOLLOWING)
FROM   tbl

-> SQLfiddle для 9.3

Но не в версии 8.4:

-> SQLfiddle для 8.4

Синтаксис ROWS BETWEEN frame_start AND frame_end был введен в Postgres 9.0 и недоступен в 8.4. Сравните текущее руководство с его 8.4 аналог.

Postgres 8.4 на данный момент устарел и этим летом будет завершен срок службы. Рассмотрите возможность обновления до текущей версии.

person Erwin Brandstetter    schedule 24.02.2014

Если array_agg не работает в вашей версии, попробуйте этот подход

WITH Q AS(
  SELECT week,
         row_number() over (order by week) rn
  FROM test
)
SELECT week,
       ( SELECT array_agg(q2.week) 
         FROM q q2
         WHERE q2.rn BETWEEN q1.rn
                     AND q1.rn + 12
       )
FROM q q1;

рабочая демонстрация (на 8.4.17) -> http://sqlfiddle.com/#!11/7eda9/1
но может быть медленным.

person krokodilko    schedule 24.02.2014