【发布时间】:2019-07-21 20:30:26
【问题描述】:
我有一个要求,我需要知道sum(value) 何时达到某个点并计算持续时间。下面是示例表。
create table sample (dt timestamp, value real);
insert into sample values
('2019-01-20 00:29:43 ',0.29)
,('2019-01-20 00:35:06 ',0.31)
,('2019-01-20 00:35:50 ',0.41)
,('2019-01-20 00:36:32 ',0.26)
,('2019-01-20 00:37:20 ',0.33)
,('2019-01-20 00:41:30 ',0.42)
,('2019-01-20 00:42:28 ',0.35)
,('2019-01-20 00:43:14 ',0.52)
,('2019-01-20 00:44:18 ',0.25);
现在我的要求是计算以下行的累积总和,以查看 sum(value) 何时达到 1.0 以上。这可能只需要 1 行或 n 行。到达该行后,我需要计算当前行与sum(value) 达到1.0 以上的行之间的时间差。
基本上我想要的输出格式如下。
对于第 1 行,累积 sum(value) 在第 3 行达到。
对于第 2 行,累积 sum(value) 在第 4 行达到等。
dt | value | sum(value)| time_at_sum(value)_1| Duration
---------------------+--------+------------------------------------------
2019-01-20 00:29:43| 0.29 | 1.01 | 2019-01-20 00:35:50 | 00:06:07
2019-01-20 00:35:06| 0.31 | 1.31 | 2019-01-20 00:37:20 | 00:02:14
2019-01-20 00:35:50| 0.41 | 1.00 | 2019-01-20 00:37:20 | 00:01:30
2019-01-20 00:36:32| 0.26 | 1.01 | 2019-01-20 00:41:30 | 00:04:58
2019-01-20 00:37:20| 0.33 | 1.10 | 2019-01-20 00:42:28 | 00:05:08
2019-01-20 00:41:30| 0.42 | 1.29 | 2019-01-20 00:43:14 | 00:01:44
2019-01-20 00:42:28| 0.35 | 1.12 | 2019-01-20 00:44:18 | 00:01:50
2019-01-20 00:43:14| 0.52 | NULL | - | -
2019-01-20 00:44:18| 0.25 | NULL | - | -
任何人对如何处理上述要求有想法或指示?
【问题讨论】:
-
那么
sum(value)和数据有什么关系? -
它的值列的累积总和,直到它达到 1.0.. 只是显示预期的输出..
-
您为
value显示的数据显然不能与sum(value)示例相加。您能否编辑描述以显示示例中从value到sum(value)的实际计算? -
嗨@bignose,我已经编辑了我的请求。我手动填充了所需的输出列。基本上 Sum(value) 是下 n 个记录的累积总和,直到它达到值 1
-
1.00forsum(value)在你的结果中违反了你的条件when the sum(value) reaches above 1.0,它转换为> 1.0,而不是>= 1.0。
标签: sql postgresql sqlcommand cumulative-sum rolling-computation