最近的非空列的总和(具有“忽略空值”的窗口函数)

时间:2013-07-03 19:46:16

标签: postgresql

我正在使用PostgreSQL 9.1.9。

在我正在处理的项目中,一些最新的记录具有空列,因为在创建该行时该信息不可用。我有一个视图,列出属于组成员的行总和。截至目前,该视图显示了最新列的总和,如果这些列是最新值,则使用空值。例如,

table1

group_name | member
-------------------
group1     | Andy
group1     | Bob

table2

name | stat_date | col1 | col2 | col 3
--------------------------------------
Andy | 6/19/13   | null |    1 |     2
Andy | 6/18/13   |  100 |    3 |     5
Bob  | 6/19/13   |   50 |    9 |    12
Bob  | 6/18/13   |  111 |   31 |    51

-- creating view would be something like this... 
create view v_grouped as 
select table1.group_name, stat_date, 
sum(col1) as col1_sum, sum(col2) as col2_sum, sum(col3) as col3_sum
from table1
join table2 on table1.member = table2.name
group by table1.group_name, table2.stat_date;

当前视图如下所示:

group_name | stat_date | col1_sum | col2_sum | col3_sum
-------------------------------------------------------
group1     | 6/19/13   |       50 |       10 |       14
group2     | 6/18/13   |      211 |       34 |       56

尽管缺乏6/19的数据,但150不是50,而是更接近地表示实际组总数。所以,我想要输出

group_name | stat_date | col1_sum | col2_sum | col3_sum
-------------------------------------------------------
group1     |   6/19/13  |     150 |       10 |       14
group2     |   6/18/13  |     211 |       34 |       56

我一直在从窗口函数中查看first_value()作为可能使用的函数。我发现Oracle的first_value()支持ignore nulls选项,我相信它会做我想做的事情(http://psoug.org/definition/FIRST_VALUE.htm)。根据我链接的这个页面,关于PL / SQL的first_value()函数:

  

如果结果集中的第一个值为NULL,则除非指定IGNORE NULLS,否则该函数将返回NULL。   如果使用IGNORE NULLS参数,则FIRST_VALUE将返回结果集中找到的第一个非空值。 (我摔倒   如果为null,则返回NULL。)

     

语法示例:FIRST_VALUE(表达式[INGORE NULLS])OVER(analytic_clause)

但PostgreSQL的first_value()不支持这样的选项。有没有办法在PostgreSql中执行此操作?先感谢您!

2 个答案:

答案 0 :(得分:4)

您可以使用this自定义聚合作为FIRST_VALUE(expression INGORE NULLS)的postgres变体。或者用期望的行为构建自己的聚合。

答案 1 :(得分:0)

这是你想描述的吗?

SELECT sum(col1), sum(col2), sum(col3) FROM table2 WHERE col1 IS NOT NULL

(虽然我省略了table1上的连接;这是读者的练习)