假设您(在Postgres 9.1中)有这样一个表:
date | value
Run Code Online (Sandbox Code Playgroud)
它有一些空白(我的意思是:并非每个可能的日期在最小(日期)和最大(日期)之间有它的行).
我的问题是如何聚合这些数据,以便分别处理每个一致的组(没有间隙),如下所示:
min_date | max_date | [some aggregate of "value" column]
Run Code Online (Sandbox Code Playgroud)
有什么想法怎么做?我相信这是可能的窗口功能,但是过了一段时间,试图lag()和lead()我有点卡住了.
例如,如果数据是这样的:
date | value
---------------+-------
2011-10-31 | 2
2011-11-01 | 8
2011-11-02 | 10
2012-09-13 | 1
2012-09-14 | 4
2012-09-15 | 5
2012-09-16 | 20
2012-10-30 | 10
Run Code Online (Sandbox Code Playgroud)
输出(sum作为聚合)将是:
min | max | sum
-----------+------------+-------
2011-10-31 | 2011-11-02 | 20
2012-09-13 | 2012-09-16 | 30
2012-10-30 | 2012-10-30 | 10
Run Code Online (Sandbox Code Playgroud) 假设我们(在PostgreSQL 9.1中)有一个带有一些标识符的表,一个类型为integer []的列和一些其他列(至少有一个,尽管可能有更多)的整数类型(或任何其他可以求和的列).
目标是为"summable"列的每个标识符和数组列的所有不同元素的数组提供聚合.
我能找到的唯一方法是在子查询中的数组列上使用不必要的函数,然后将其与聚合"可累计"列的另一个子查询连接.
一个简单的例子如下:
CREATE TEMP TABLE a (id integer, aint integer[], summable_val integer);
INSERT INTO a VALUES
(1, array[1,2,3], 5),
(2, array[2,3,4], 6),
(3, array[3,4,5], 2),
(1, array[7,8,9], 19);
WITH u AS (
SELECT id, unnest(aint) as t FROM a GROUP BY 1,2
),
d AS (
SELECT id, array_agg(distinct t) ar FROM u GROUP BY 1),
v as (
SELECT id, sum(summable_val) AS val
FROM a GROUP BY 1
)
SELECT v.id, v.val, d.ar
FROM v …Run Code Online (Sandbox Code Playgroud)