繁体   English   中英

按时间范围分组的行数

[英]Counts of rows grouped by time frames

我有什么:

| 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
...

我发现的只是整天。 有没有在数据库层上执行此操作的好方法? 我让它运行的唯一方法是使用多个查询并在应用程序层上对其进行计算,但这太昂贵了。

由于您将数据存储为时间戳,因此可以肯定地通过简单的计算就可以做到这一点,因为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;

该过程未经测试,可能无法立即使用,但可以使您了解可以做什么。 然后,您可以在应用程序端将整数时间戳转换回真实时间戳。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM