2016-01-22 284 views
0

我有什么:帧计数

| id | timestamp | 
| ---| -----------| 
| 1 | 1453212172 | 
| 2 | 1453512172 | 
| 3 | 1453712172 | 
... 

我想通过时间框架分组条目的数量。从2015-11-01 20:00开始,我需要为持续3天的团体计数:

| count | from  | to 
| ------| -----------|----------- 
| 34 | day 0, 8am | day 3, 8am 
| 10 | day 3, 8am | day 6, 8am 
| 56 | day 6, 8am | day 9, 8am 
... 

我发现只有整整一天。有没有在数据库层上做到这一点的好方法?我得到它的唯一方法是使用多个查询并在应用程序层计算它,但它太昂贵了。

回答

1

因为要存储的数据的时间戳,当然你可以用一个简单的计算做到这一点,在3天内为:

24 x 60 * 60 = 86400 

与存储过程中它得到的最小和最大的时间戳一起该数据集,将它们转换为整数,然后使用WHILE遍历数据直到到达结束迭代,返回一个汇总行,因为你需要:

CREATE OR REPLACE FUNCTION get_counts() RETURNS TABLE(row_count integer, from_time integer, to_time integer) 
AS $BODY$ 
    DECLARE 
    current_timestamp INTEGER; 
    maximum_timestamp INTEGER; 
    next_timestamp INTEGER; 
    BEGIN 
    current_timestamp := (SELECT CAST(EXTRACT(epoch FROM MIN(timestamp)) AS integer) FROM test); 
    maximum_timestamp := (SELECT CAST(EXTRACT(epoch FROM MAX(timestamp)) AS integer) FROM test); 

    WHILE current_timestamp < maximum_timestamp LOOP 
     next_timestamp := current_timestamp + 86400; 
     RETURN QUERY EXECUTE (SELECT COUNT(*) AS row_count, current_timestamp AS from_time, next_timestamp AS to_time FROM test WHERE CAST(EXTRACT(epoch FROM(timestamp)) AS integer) >= current_timestamp AND CAST(EXTRACT(epoch FROM(timestamp)) AS integer) < next_timestamp); 
     current_timestamp := next_timestamp; 
    END LOOP; 
    END 
$BODY$ LANGUAGE plpgsql; 

该程序是未经测试,可能不会制定出盒子,b ut让你知道你能做什么。然后,您可以从整数时间戳转换回应用端的真实时间戳。

+1

我不'有任何工作查询呢。但是,你所建议的只是一个时间范围内行的选择。我想让他们按时间框架分组。 – messy

+0

自从我回答以来,您的问题发生了变化,我将更新我的回答 – toomanyredirects

+0

我没有更改我的问题的含义,但它更加清晰。谢谢你的回答,但功能不是我想要的。我会在应用程序层上执行它。我希望用'正常'的查询逻辑来解决问题。我感谢你的努力。尚未测试您的解决方案。 – messy