1

当谈到 postgres 时,我是一个新手,所以请耐心等待,我会看看我是否可以提供足够的信息。

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

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

我想做的是浏览每一行直到每小时结束,然后得到那一行,但是在过去的 4 小时内完成,所以我只会返回 4 行。

这可能在 1 个查询中吗?或者我应该做多个查询?

我想在 1 个查询中执行此操作,但不要大惊小怪...

谢谢


谢谢大家的回答,我/我对你的加文有点困惑 - 抱歉:) 来自于不知道这一点非常好。

我仍然有点不确定,所以我会尝试更好地解释它..

我有一个 ac 程序,每 10 分钟将数据插入数据库,它从保持最后一小时降雨的设备中读取数据,因此每 10 分钟它可以增加 x 量。所以我想我有 6 行/小时的数据。我的计划是每 7 次返回(在我的 php 页面中),这将是每个小时的最后一个条目,然后获取该值。因此,为什么我只需要 4 行......只是间隔了一点!

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

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

所有人都希望以更好的方式存储它:)我也非常感谢您的帮助,谢谢。

4

3 回答 3

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 ; 

做你需要的?

于 2011-09-13T15:36:50.403 回答
2

SELECT SUM(rainfall) FROM weatherdata WHERE time > (NOW() - INTERVAL '4 hour' );

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

于 2011-09-13T10:18:58.917 回答
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;
于 2011-09-13T14:16:48.577 回答