【问题标题】:Get column values from multiple rows as array从多行获取列值作为数组
【发布时间】:2014-03-26 10:13:35
【问题描述】:

我正在尝试将列值作为数组获取,以便在 function array_agg_transfn() to calculate the median value as defined in the 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 行中的列值构建一个数组?

【问题讨论】:

  • 最好为您的案例提供表定义和一些示例值,最好是在 SQLfiddle (example) 或类似的东西中。并在处理您的声明时对其进行修正,对a 的引用无效。

标签: sql postgresql aggregate-functions postgresql-8.4 window-functions


【解决方案1】:

这适用于 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 for 9.3

但不在 8.4 版中:

-> SQLfiddle for 8.4

语法ROWS BETWEEN frame_start AND frame_end 是在 Postgres 9.0 中引入的,在 8.4 中不可用。将current manual 与其8.4 counterpart 进行比较。

Postgres 8.4 is rather old by now and reaching EOL this summer。考虑升级到当前版本。

【讨论】:

    【解决方案2】:

    如果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
    但它可能会很慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多