【问题标题】:PostgreSQL: Return a single row with window functionPostgreSQL:使用窗口函数返回单行
【发布时间】: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 吗?请注意,最后一行的累积总和将等于所有值的总和,直到并包括按组中的最后一行
  • 如果我只想要一次性运行总计,这很有效。但我也需要按日期分组,以获得每月的运行总数。还有其他想法吗?
  • 只需按顶层添加组

标签: sql postgresql aggregate-functions window-functions


【解决方案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!
猜你喜欢
  • 2012-12-20
  • 2018-12-15
  • 2018-12-08
  • 2012-01-09
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2013-07-25
  • 2013-04-16
相关资源
最近更新 更多