我有一个应用程序可以记录某台机器的三种状态.我需要报告机器每天从00:00:00到23:59:59在每个州停留的时间.

我需要一个帮助来构建一个postgresql查询,以获取某个事件在一天中发生的整个时间间隔.

例如,如下图所示,数据显示在前一天23:50:00到第二天01:00:00之间.

device_id varchar(50) Value int4 Date_time timestamptz
device1 0 2022-23-04 23:50:00
device1 0 2022-24-04 00:10:00
device1 0 2022-24-04 00:15:00
device1 0 2022-24-04 00:20:00
device1 1 2022-24-04 00:25:00
device1 1 2022-24-04 00:30:00
device1 1 2022-24-04 11:00:00
device1 0 2022-24-04 21:00:00
device1 1 2022-25-04 01:00:00

我在计算状态变化之间的持续时间,我也在表格中插入,我只是简单地求和,但它给出了以下结果:

总计:

  • 状态=0-04:35
  • 州=1-20:35
  • 两者之和=25:10:00

我需要的查询应该考虑到不是2021年4月24日的其他日期的时间部分,并且必须给出:

2022年4月24日总计:

  • 州=0-03:25
  • 州=1-20:35
  • 两者之和=24:00:00

在每天的和中,我需要计算机器在每个状态下停留的时间百分比,并绘制一个饼图.

有没有一种方法可以满足这种需求?

提前感谢大家的帮助.

@shawnt00回答有效.现在,我试图找出如何组织数据,以便查询结果如下所示:

device_id state_0 state_1 state_9
device_id timespan_state_0 timespan_state_1 timespan_state_9

对于给定的示例,应该如下图所示,我添加了第二个设备以增强示例:)

device_id state_0 state_1 state_9
device1 03:25 20:35 00:00
device2 X Y Z

那个.

赢家马丁斯

推荐答案

我认为你只需要使用lead()/lag()case个表达式来检测午夜的跨度.无需加入:

with data as (
    select *,
        cast(date_trunc('day', Date_time) as date) as dt,
        lag(Date_time) over (partition by device_id order by Date_time) as last_Date_time,
        lead(Date_time) over (partition by device_id order by Date_time) as next_Date_time
    from T
)
select device_id, dt as "date", Value,
    coalesce(sum(
        case when date_trunc('day', next_Date_time) > date_trunc('day', Date_time)
             then date_trunc('day', Date_time + interval '1 day') - Date_time
             else coalesce(next_date_time - Date_time, interval '0 seconds') end
        +
        case when date_trunc('day', last_Date_time) < date_trunc('day', Date_time)
             then Date_time - date_trunc('day', Date_time)
             else interval '0 seconds' end
    ), interval '0 seconds') as timespan2
from data
group by device_id, dt, Value
order by device_id, dt, Value;

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=ab32fee1615b637f9f2f844aa1bf5064

我不太熟悉所有的PostGres日期函数,所以可能有一种更简洁的方法来计算时间.

Sql相关问答推荐

Group By子句返回太多行

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

关于Postgres横向联接的谓词

在UNION查询中查找MIN

在Athena中使用regexp提取括号前的字符串值

STContains、STIntersections和STWithin返回错误的地理结果

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

如何在Hive SQL中分别按多列进行分组?

获取上个月和上一年的值

SQL:考虑合并分支计算分支的增长百分比

按公司和产品查询最近发票的平均价格的SQL查询

在自引用表中使用分组和计数的SQL查询语句

Postgres更新增量之间的差异

oracle中多行的跨日期范围的交集

编写查询以根据级别 (p2) 返回父位置

SQL 中的问题与包含最大日期的记录连接

删除具有相同 ID 的重复记录 - Postgresql

如何列出 Oracle 数据库中的所有函数并按修改日期排序