当前位置:  开发笔记 > 数据库 > 正文

按数据间隔分组

如何解决《按数据间隔分组》经验,为你挑选了2个好方法。

我有一个表,可以在一段时间内存储网络上的带宽使用情况.一列将包含日期时间(主键),另一列将记录带宽.每分钟记录一次数据.我们将在那个时刻记录其他数据.

如果用户以15分钟的间隔(在给定的开始和结束日期的24小时内)请求数据,是否可以使用单个查询来获取我需要的数据,或者我是否必须编写存储过程/光标来执行此操作?然后,用户可以请求5分钟间隔数据等.

我很可能会使用Postgres但是还有其他NOSQL选项会更好吗?

有任何想法吗?



1> Erwin Brands..:
WITH t AS (
   SELECT ts, (random()*100)::int AS bandwidth
   FROM   generate_series('2012-09-01', '2012-09-04', '1 minute'::interval) ts
   )

SELECT date_trunc('hour', ts) AS hour_stump
      ,(extract(minute FROM ts)::int / 15) AS min15_slot
      ,count(*) AS rows_in_timeslice               -- optional
      ,sum(bandwidth) AS sum_bandwidth
FROM   t
WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz -- user's time range
AND    ts <  '2012-09-03 00:00:00+02'::timestamptz -- careful with borders 
GROUP  BY 1, 2
ORDER  BY 1, 2;

该CTE t提供数据,如您的表可能成立:一个时间戳ts每分钟有一个bandwidth号码.(您不需要那部分,而是使用您的表格.)

对于一个非常相似的问题,这是一个非常类似的解决方案 - 详细说明了这个特定聚合的工作原理

post_SQL中的date_trunc 5分钟间隔

以下是关于运行总和的类似问题的类似解决方案- 详细说明和所用各种功能的链接:

PostgreSQL:按分钟运行查询的行数

评论中的其他问题

WITH -- same as above ...

SELECT DISTINCT ON (1,2)
       date_trunc('hour', ts) AS hour_stump
      ,(extract(minute FROM ts)::int / 15) AS min15_slot
      ,bandwidth AS bandwith_sample_at_min15
FROM   t
WHERE  ts >= '2012-09-02 00:00:00+02'::timestamptz
AND    ts <  '2012-09-03 00:00:00+02'::timestamptz
ORDER  BY 1, 2, ts DESC;

每隔15分钟检索一个未聚合的样本 - 从窗口中的最后一个可用行开始.如果没有丢失行,这将是第15分钟.关键部分是DISTINCT ONORDER BY.
有关使用过的技术的更多信息:

选择每个GROUP BY组中的第一行?



2> Clodoaldo Ne..:
select
    date_trunc('hour', d) + 
    (((extract(minute from d)::integer / 5 * 5)::text) || ' minute')::interval
    as "from",
    date_trunc('hour', d) + 
    ((((extract(minute from d)::integer / 5 + 1) * 5)::text) || ' minute')::interval
    - '1 second'::interval
    as "to",
    sum(random() * 1000) as bandwidth
from 
    generate_series('2012-01-01', '2012-01-31', '1 minute'::interval) s(d)
group by 1, 2
order by 1, 2
;

那5分钟的范围.15分钟除以15分钟.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有