首页 > 解决方案 > 有条件地从多行计算持续时间

问题描述

如果我session_logs在 PostgreSQL 10.5 中有一个包含以下条目的表:

id recorded_at          powered  camera_blocked
----------------------------------------------------
1  2019-06-26 13:40:00  true     false
2  2019-06-26 13:45:00  false    false
3  2019-06-26 13:50:00  false    true
4  2019-06-26 13:55:00  false    false
5  2019-06-26 14:00:00  true     false
6  2019-06-26 14:05:00  true     false

我想写一个查询,它会给我以下结果

started_at           ended_at            power_dur battery_dur camera_blocked_dur
--------------------------------------------------------------------------------------
2019-06-26 13:40:00 2019-06-26 13:55:00  10        15          5

(其中持续时间 (dur) 以分钟为单位)

如何编写可以正确汇总这些值的查询?

标签: sqlpostgresql

解决方案


您可以使用lead()和条件聚合

select min(recorded_at), max(recorded_at),
       sum(next_recorded_at - recorded_at) filter (where powered),
       sum(next_recorded_at - recorded_at) filter (where camera_blocked)
from (select t.*,
             lead(recorded_at) over (order by recorded_at) as next_recorded_at
      from t
     ) t

推荐阅读