sql从单个表中选择查询,结果以间隔分隔

时间:2014-10-02 14:13:05

标签: sql postgresql

我有一个表每10秒写一次数据。表中有一个字段,用于保存写入数据时的时间戳。我需要构建一个查询,我可以在其中指定时间范围(从日期到日期)和间隔,我希望在该间隔值中返回这些结果。例如,如果我有这些记录:

  • 02.10.2014T15:00:00 - 20
  • 02.10.2014T15:00:10 - 30
  • 02.10.2014T15:00:20 - 20
  • 02.10.2014T15:01:10 - 10
  • 02.10.2014T15:01:20 - 15

如果我希望结果以1分钟的间隔分组,我希望我的查询返回结果:

  • 15:00:00至15:01:00 - 70
  • 15:01:00至15:02:00 - 25

意思是,按间隔对值的总和进行分组。这可以在一个SELECT查询中完成,还是我需要执行与间隔一样多的查询来获取所需的数据?任何形式的查询优化都将不胜感激。

2 个答案:

答案 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版本,这似乎是工作