PostgreSQL:使用窗口函数返回单行

Posted

技术标签:

【中文标题】PostgreSQL:使用窗口函数返回单行【英文标题】:PostgreSQL: Return a single row with window function 【发布时间】:2014-01-17 22:28:18 【问题描述】:

我有一个具有两级细分的数据集;尝试使用窗口函数(累积和)在顶层进行汇总,但窗口函数不会将输出分组到单行中。

数据如下:

日期 |***a | a1 |要总结的字段 日期 |***a | a2 |要总结的字段 日期 |顶层b | b1 |要总结的字段 日期 |顶层b | b2 |要总结的字段 日期 |顶层b | b3 |字段总结

我在做:

SUM(field_to_summarize) OVER (partition by top_level order by date) AS CumulativeSum

如上所示,这将在每一行的每个顶层返回相同的 CumulativeSum。 如何按窗口进行聚合,但每个顶层只返回一行?像这样:

日期 |***a | a的累计金额 日期 |顶层b | b的累计和

【问题讨论】:

不只是简单的select top_level, sum(field_to_summarize) form my_table group by top_level order by top_level 吗?请注意,最后一行的累积总和将等于所有值的总和,直到并包括按组中的最后一行 如果我只想要一次性运行总计,这很有效。但我也需要按日期分组,以获得每月的运行总数。还有其他想法吗? 只需按顶层添加组 【参考方案1】:

这就是你要找的吗?注意 sum()over() 中嵌套的 sum 函数

create table myData(
date date
,top_level text
,second_level text
,value int
);

insert into myData values('2012-12-01','A', 'A1', 12);
insert into myData values('2012-12-01','A', 'A2', 19);
insert into myData values('2012-12-01','B', 'B1', 10);
insert into myData values('2012-12-01','B', 'B2', 15);

insert into myData values('2013-01-01','A', 'A1', 10);
insert into myData values('2013-01-01','A', 'A2', 7);
insert into myData values('2013-01-01','B', 'B1', 20);
insert into myData values('2013-01-01','B', 'B2', 35);


select 
date
,top_level
,sum(value) as value_total
,sum(sum(value))over(partition by top_level order by date) as value_running_total
from myData
group by date, top_level
order by top_level, date;

返回:

date; top_level; value_total; value_running_total
"2012-12-01";"A";31;31
"2013-01-01";"A";17;48
"2012-12-01";"B";25;25
"2013-01-01";"B";55;80

【讨论】:

我只是来这里更新,我将尝试这样的事情,尽管我的方法不太优雅。现在试试这个。稍后会更新。谢谢! 是的。就是这个。谢谢 Sashikanth!

以上是关于PostgreSQL:使用窗口函数返回单行的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 高级SQL(五) 内建窗口函数

使用'parititon by'和窗口函数在postgres中返回多于一行?

PostgreSQL:使用列别名的窗口函数

使用 PostgreSQL 用户定义函数实现类似窗口函数的行为?

Postgresql - 窗口函数聚合

在窗口函数 postgresql 中选择条件