sql - 有条件地从多行计算持续时间
问题描述
如果我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) 以分钟为单位)
如何编写可以正确汇总这些值的查询?
解决方案
您可以使用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
推荐阅读
- sql-server - SSIS - 带格式文件和单引号的批量插入
- android - LiveDataScope 发出不调用
- python-3.x - 在“BashOperator”中更改 Airflow 上“next_execution_date”的时间
- php - 如何根据语言/区域设置为 1、2、3 制作 PHP 输出“1st”、“2nd”、“3rd”等?
- angular8 - 数字列未显示使用角度 8 中的 ngx-highlightJs
- reactjs - 无法读取未定义 onClick 的属性“推送”
- floating-point - 多平台支持扩展类型的二进制数据文件
- css - 不能在反应 CSS 导入中为 className 使用字符串文字?
- apache-spark - 将spark dataset.写入hdfs时如何获得幂等保证?
- javascript - 从 VSCode Studio Code Webview API 中的文件夹导入所有文件