我有一个表每10秒写一次数据。表中有一个字段,用于保存写入数据时的时间戳。我需要构建一个查询,我可以在其中指定时间范围(从日期到日期)和间隔,我希望在该间隔值中返回这些结果。例如,如果我有这些记录:
如果我希望结果以1分钟的间隔分组,我希望我的查询返回结果:
意思是,按间隔对值的总和进行分组。这可以在一个SELECT查询中完成,还是我需要执行与间隔一样多的查询来获取所需的数据?任何形式的查询优化都将不胜感激。
答案 0 :(得分:1)
既然你只想要一个想法,那就是:
SELECT
count(*) AS quantity,
extract(year from mytime) ||'-'|| extract(month from mytime) ||'-'|| extract(day from mytime) ||' '|| extract(hour from mytime) ||':'|| extract(minute from mytime) ||':00' AS timestamp
FROM
test
group by 2;
简单地测试一下
CREATE TABLE test (mytime timestamp not null);
INSERT INTO test VALUES (NOW());
在不同的时间内插入这样的数据,或手动将其写下来。
您只需添加提供0's
月份,日期的CASE ......当它不是两位数时。
答案 1 :(得分:1)
如果您希望按分钟分组,则给定一个包含your_table
列的ts timestamp/datetime, val int
表格,可以扣除日期和分组的秒数部分。
应该可以使用相同的概念用于其他间隔。
使用MS SQL将是:
select
dateadd(second, -DATEPART(second,ts),ts) as ts,
SUM(val) as v_sum
from your_table
group by dateadd(second, -DATEPART(second,ts),ts)
我认为Postgresql可能就是这样:
SELECT
date_trunc('minute', ts),
sum(val) v_sum
FROM
your_table
GROUP BY date_trunc('minute', ts)
ORDER BY 1
我尝试了MSSQL版本并获得了所需的结果,但是当我无法尝试PG版本时,SQL Fiddle已经关闭。以及PG版本,这似乎是工作