小编Mic*_*ski的帖子

GROUP BY由间隙分隔的连续日期

假设您(在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)

sql postgresql aggregate window-functions

10
推荐指数
1
解决办法
3713
查看次数

从Postgres中的数组列聚合的不同值的数组

假设我们(在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)

sql arrays postgresql aggregate-functions

8
推荐指数
1
解决办法
1万
查看次数