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