PostgreSQL:按日期分组并在该日期之前获取信息

时间:2011-11-10 03:43:29

标签: sql database postgresql aggregate-functions

我正在编写一个查询,用于确定按特定基金持有股份的客户数量,该基金按该基金每天发生的交易分组。

所以我的交易表是:

CREATE TABLE trans(
transID SERIAL PRIMARY KEY,
sin CHAR(9) REFERENCES customer(sin) ON UPDATE CASCADE ON DELETE CASCADE,
fundID INT REFERENCES fund(fundID) NOT NULL,
transDate DATE,
shares INT,
FOREIGN KEY (fundID) REFERENCES fund(fundID) ON UPDATE CASCADE ON DELETE CASCADE
);

这是我的疑问:

   select f.transdate, count (f.sin) 
   from (select t1.transdate, t1.sin, sum(t2.shares) 
          from fund f natural join trans t1 natural join trans t2 
          where f.fundname='Energy' 
          and t1.sin = t2.sin 
          and t2.transdate <= t1.transdate 
          group by t1.transdate, t1.sin 
          having sum(t2.shares) > 0)as f group by f.transdate 
          order by f.transdate;

这将返回当天持有股票的客户总数。但是,我还希望在之前的几天内添加持有同一基金股票的客户。

所以我想说,如果我添加以下插入内容:

INSERT INTO trans VALUES (DEFAULT, '1', '3', '2011-10-10', 400);
INSERT INTO trans VALUES (DEFAULT, '3', '3', '2011-10-11', 324);
INSERT INTO trans VALUES (DEFAULT, '5', '3', '2011-10-17', 201);
INSERT INTO trans VALUES (DEFAULT, '8', '3', '2011-10-17', 472);

所以我说的查询会返回:

 transdate  | count 
------------+-------
 2011-10-10 |     1
 2011-10-11 |     1
 2011-10-17 |     2

但是,我希望它是这样的:

 transdate  | count 
------------+-------
 2011-10-10 |     1
 2011-10-11 |     2
 2011-10-17 |     4

如您所见,截至2011年10月11日,共有2人持有该基金的股份,等等。

任何帮助?

1 个答案:

答案 0 :(得分:2)

看看Window Functions。您可以按如下方式构建查询:

  • 从查询开始,您必须获取日期和计数

  • 从此结果中查询日期和计数,并添加一个带有“滞后”功能的列以获取上一行的值。可以跳过窗口分区,因为它应该在整个行集上。订单应该按日期。您现在拥有上一个日期(上一行)的日期,计数和计数。

  • 从此结果查询日期和其他两列的总和

最好稍微尝试一下。 Oracle将Window函数称为“分析函数”。这是一个example