我有一个表,该表在PostgreSQL数据库中包含三列。这三列分别是timestamp
,tag
和value
。在此表中,将从SCADA服务器生成的日志文件中自动插入数据。我需要该表中的每小时数据。 (20:00:00,21:00:00)
timestamp tag value
2019-06-06 06:00:00 x 123
2019-06-06 06:00:00 y 456
2019-06-06 06:01:00 x 123
2019-06-06 06:01:00 y 656
2019-06-06 06:02:00 x 123
2019-06-06 06:02:00 y 333
.......
.......
2019-06-06 06:59:00 x 2232
2019-06-06 06:59:00 y 654
2019-06-06 07:00:00 x 5645
2019-06-06 07:00:00 y 54654
我想要确切的数据在2019-06-06 06:00:00 07:00:00。该表每分钟都在更新,因此我无法将其写在哪里。
所需的输出应该是这样的。
timestamp tag value
2019-06-06 06:00:00 x 123
2019-06-06 06:00:00 y 456
2019-06-06 07:00:00 x 5645
2019-06-06 07:00:00 y 54654
...
.....
......
2019-06-09 07:00:00 x 5645
2019-06-09 07:00:00 y 54654
答案 0 :(得分:0)
您可以先提取时间戳的小时部分,然后按小时分组结果。
SELECT date_part('hour', timestamp) as hour, STRING_AGG(tag, ','), STRING_AGG(value, ',')
FROM your_table
GROUP BY hour;
各种functions提取时间戳的不同部分。
STRING_AGG可用于合并不同行中的值。
答案 1 :(得分:0)
似乎您只想要在整整一个小时记录的那些行。
您可以使用简单的WHERE子句来实现
select *
from the_table
where date_trunc('hour', "timestamp") = "timestamp";
date_trunc
将时间戳值“截断”到给定的粒度。因此,分钟,秒和毫秒将设置为零。