以行比较为条件的 Postgres 聚合总和
Postgres aggregate sum conditional on row comparison
所以,我的数据看起来像这样
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 =
但是,我想以某种方式改变它,以便 window 函数有一个条件,当该行没有删除日期时,仅获取在此用户对象之前创建的任何行的总和也在这个用户对象之前。
这个不正确的语法说明了我想要做什么:
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 =
当这个函数在我拥有的数据上运行时,它应该输出类似
的内容
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
对于每一行,自连接,匹配 ID 小于或等于,并且日期重叠。这将是昂贵的,因为每一行都需要查看整个 table 来计算文件大小结果。这里没有发生累积操作。但我不确定是否有办法。
示例 table 定义:
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
所以,我的数据看起来像这样
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 =
但是,我想以某种方式改变它,以便 window 函数有一个条件,当该行没有删除日期时,仅获取在此用户对象之前创建的任何行的总和也在这个用户对象之前。
这个不正确的语法说明了我想要做什么:
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 =
当这个函数在我拥有的数据上运行时,它应该输出类似
的内容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
对于每一行,自连接,匹配 ID 小于或等于,并且日期重叠。这将是昂贵的,因为每一行都需要查看整个 table 来计算文件大小结果。这里没有发生累积操作。但我不确定是否有办法。
示例 table 定义:
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