2014-10-02 65 views
0

我有一张表,每10秒钟写一次数据。表中有一个字段,用于保存数据写入时的时间戳。我需要构造一个查询,我可以指定一个时间范围(从日期到日期)和一个时间间隔,我希望那些结果以该时间间隔返回。举例来说,如果我有这些记录:sql select select查询来自单个表,结果由时间间隔分隔

  • 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查询中完成,还是需要执行尽可能多的查询以获得所需的数据?任何形式的查询优化将不胜感激。

+0

您正在使用哪个dbms?它是MySQL或MS SQL或Oracle – radar 2014-10-02 14:14:35

+0

这是PostgreSQL的,但我需要一个想法,我要构建的查询语法自己事后 – 2014-10-02 14:16:11

回答

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的版本,并得到想要的结果,但SQL小提琴是此刻我无法尝试PG版本。和PG版本,这似乎工作。

+0

现在我们要去哪里......我知道我需要使用GROUP BY,但我不不知道如何实现我的目标......事情是,datetime列实际上是一个日期(1411552117879)的Long表示,它不一定是15:00:00,它可以是15:00:03.256。 ..我的想法是在SELECT子句中添加另一个字段,并在该子句上进行分组,但我目前仍然在那里... – 2014-10-02 14:51:26

+0

@ZoranTrifunovski我已经更新了我的答案的Postgresql部分。使用date_trunc方法可以在示例中将时间戳截断为期望的精度(分钟)。 – jpw 2014-10-02 14:54:40

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 ...当它不是两位数。