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

PostgreSQL:按日期分组并获取该日期之前的信息,sql,database,postgresql,aggregate-functions,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, FOREI

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

因此,我的事务表是:

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;
因此,我所说的查询将返回以下结果:

 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人持有该基金的股份,以此类推

有什么帮助吗?

看看。您可能可以按如下方式建立查询:

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

  • 根据该结果,查询日期和计数,并使用“lag”函数添加一列,以获取前一行的值。窗口分区可以跳过,因为它应该覆盖整个行集。订单日期应为。现在您有了日期、计数和上一个日期(上一行)的计数

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


最好只是尝试一下。Oracle将窗口函数称为“分析函数”。下面是一个示例。

您是否考虑过创建
聚合表
?这些表是按天、按月、按站点上最常见的查询预先填充的。您是否希望只包含一个transdate(例如,最新的transdate),但仍要计算所有以前的transdate?或者你想在某个特定的日期之前的所有日子里,分别计算每个日期的计数吗?@a_horse_,没有名字,我想分别计算每个日期的计数,以及该特定基金在这之前的所有日子的计数。@Dream:那不应该是一个简单的
在transdate中,我更新了我的帖子。。。当我尝试了它,但无法检索到我想要的结果。
 transdate  | count 
------------+-------
 2011-10-10 |     1
 2011-10-11 |     2
 2011-10-17 |     4