当谈到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
所有的耳朵都有更好的存储方式:)我非常感谢你的帮助太多了谢谢。
答案 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;