选择一段时间内的数据

时间:2011-09-13 09:54:06

标签: postgresql select time epoch

当谈到postgres时,我有点新手,所以请耐心等待一下,我会看看能不能提供足够的信息。

我每隔10分钟将天气数据插入表中,我有一个时间列,上面印有一个纪元日期。

我有一个最后一小时降雨的列,当然每个小时数随着运行总数(当时)的变化而变化。

我想做的是浏览行到每小时结束,并获取该行,但是在过去4小时内完成,所以我只会返回4行说。

这是否可以在1个查询中进行?或者我应该做多个查询?

我想在1个查询中执行此操作,但没有讨论...

由于


谢谢你们的答案,我/你有点困惑你的gavin - 抱歉:)来自于不太了解这一点。

我对此仍然有点不确定,所以我会尝试解释一下......

我有一个c程序,每隔10分钟将数据插入数据库,它会读取一个设备,使最后一个小时下雨,所以每10分钟可以上升x个数量。 所以我想我有6行/小时的数据。 我的计划是每7回到(在我的php页面中),这将是每小时的最后一个条目,并且只是获取该值。因此,为什么我只需要4行......只是间隔一点!

我的表格(读数)有这样的数据

index | time (text)  | last hrs rain fall (text)
1     | 1316069402   | 1.2

所有的耳朵都有更好的存储方式:)我非常感谢你的帮助太多了谢谢。

3 个答案:

答案 0 :(得分:4)

您应该可以在一个查询中执行此操作...

有点像:

SELECT various_columns,
    the_hour,
    SUM ( column_to_be_summed )
FROM ( SELECT various_columns,
            column_to_be_summed,
            extract ( hour FROM TIME ) AS the_hour
       FROM readings
      WHERE TIME > ( NOW() - INTERVAL '4 hour' ) ) a
GROUP BY various_columns,
    the_hour ; 

做你需要的吗?

答案 1 :(得分:1)

SELECT SUM(降雨量)FROM weatherdata WHERE time> (现在() - INTERVAL'4小时');

我不知道列名,但是应该这样做,大写的是pgsql类型。这就是你追求的目标吗?

答案 2 :(得分:1)

我不确定这是否正是您所寻找的,但也许它可以作为适应的基础。 虽然我没有使用纪元时间,但我经常需要在时间段内生成汇总数据,因此可能有更好的方法来操纵值,而不是我想出的。

创建并填充测试表

create table epoch_t(etime numeric);
insert into epoch_t 
select extract(epoch from generate_series(now(),now() - interval '6 hours',interval '-10 minutes'));

将时间划分为期间桶:

select generate_series(to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz,
                       to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '4 hours', 
                       interval '-1 hour');

将纪元时间转换为postgres时间戳:

select timestamptz 'epoch' + etime * '1 second'::interval from epoch_t;

然后截断到小时:

select to_char(timestamptz 'epoch' + etime * '1 second'::interval,
               'yyyy-mm-dd hh24:00:00')::timestamptz  from epoch_t

按小时提供摘要信息:

select to_char(timestamptz 'epoch' + etime * '1 second'::interval,
               'yyyy-mm-dd hh24:00:00')::timestamptz,
       count(*)  
  from epoch_t 
 group by 1 
 order by 1 desc;

如果您可能在数据中存在间隙但需要报告零结果,请使用generate_series创建期间存储桶并将左连接保留到数据表。 在这种情况下,我在数据填充之前创建样本小时桶 - 9小时而不是6,并加入将纪元时间转换为时间戳截断为小时。

select per.sample_hour,
       sum(case etime is null when true then 0 else 1 end) as etcount
  from (select generate_series(to_char(now(),
                               'yyyy-mm-dd hh24:00:00')::timestamptz,
                               to_char(now(),'yyyy-mm-dd hh24:00:00')::timestamptz - interval '9 hours', 
                               interval '-1 hour') as sample_hour) as per
       left join epoch_t on to_char(timestamptz 'epoch' + etime * '1 second'::interval,
                                    'yyyy-mm-dd hh24:00:00')::timestamptz = per.sample_hour
group by per.sample_hour
order by per.sample_hour desc;