Postgresql Postgres聚合和条件行比较

Postgresql Postgres聚合和条件行比较,postgresql,window-functions,Postgresql,Window Functions,所以,我有这样的数据 User_Object | filesize | created_date | deleted_date row 1 | 40 | May 10 | Aug 20 row 2 | 10 | June 3 | Null row 3 | 20 | Nov 8 | Null 我正在构建统计数据,以记录基于时间的数据点的用户数据使用情况。但是,我很难开发一个查询来获

所以,我有这样的数据

User_Object | filesize | created_date | deleted_date
row 1       | 40        | May 10       | Aug 20
row 2       | 10        | June 3       | Null
row 3       | 20        | Nov 8        | Null
我正在构建统计数据,以记录基于时间的数据点的用户数据使用情况。但是,我很难开发一个查询来获取它之前所有查询的每一行的总和,但仅限于创建该行时存在的行。在采取此步骤合并已删除的值之前,我有一个简单的朴素查询,如下所示:

SELECT User_Object.id, User_Object.created, SUM(filesize) OVER (ORDER BY User_Object.created) AS sum_data_used
    FROM User_Object
    JOIN user ON User_Object.user_id = user.id
    WHERE user.id = $1
但是,我想以某种方式对此进行修改,以便窗口函数有一个条件,当该行在该用户对象之前没有删除日期时,只获取在该用户对象之前创建的任何行的总和

此错误语法说明了我要执行的操作:

SELECT User_Object.id, User_Object.created, 
        SUM(CASE WHEN NOT window_function_row.deleted
            OR window_function_row.deleted > User_Object.created
            THEN filesize ELSE 0)
        OVER (ORDER BY User_Object.created) AS sum_data_used
    FROM User_Object
    JOIN user ON User_Object.user_id = user.id
    WHERE user.id = $1
当这个函数在我拥有的数据上运行时,它应该输出如下内容

id      | created | sum_data_used|
1       | May 10  | 40
2       | June 3  | 50
3       | Nov 8   | 30

以下几点可能适合您:

SELECT a.user_id
      ,MIN(a.created_date) AS created_date
      ,SUM(b.filesize) AS sum_data_used
  FROM user_object a
  JOIN user_object b ON (b.user_id <= a.user_id
                    AND COALESCE(b.deleted_date, a.created_date) >= a.created_date)
  GROUP BY a.user_id
  ORDER BY a.user_id
数据:


非常感谢你的建议!不幸的是,这最终将是一个昂贵的查询,但这就是为什么我想在这里运行它,然后我对子查询做了一些糟糕的事情,这些子查询的复杂性甚至比这个n^2复杂
create table user_object(user_id int, filesize int, created_date date, deleted_date date);
1;40;2016-05-10;2016-08-29
2;10;2016-06-03;<NULL>
3;20;2016-11-08;<NULL>
1;2016-05-10;40
2;2016-06-03;50
3;2016-11-08;30