2015-02-23 113 views
0

我有两个表:SQL查询来计算平均

其中包含每15分钟 enter image description here

时间表

enter image description here

采取了时间序列温度的

温控表

我需要一个SQL查询,这将允许一个平均组15分钟内采取几天的avry值

任何人都可以帮助我吗?

例如:3天

day1:00:00->10 ; 00:15->11 ;00:30->9......;23:45->12 
day2:00:00->9 ; 00:15->2 ;00:30->5......;23:45->4 
day3:00:00->8 ; 00:15->10 ;00:30->8......;23:45->5 

算算:

avarage1 =10+9+8/3 
avarage2 =11+2+10/3 
avarage3=9+5+8/3 
... 
avarage96=12+4+5/3 

帮我请

+0

为什么不使用单个['时间戳'(带或不带时区,取决于您的工作流程)](http://stackoverflow.com/questions/9571392/ignoring-timezones-altogether-in- rails-and-postgresql/9576170#9576170)来替换所有这些列:'年,月,日,时,分,秒'。 – 2015-02-23 17:04:53

+0

具有详细解释的解决方案:http://stackoverflow.com/questions/8193688/postgresql-running-count-of-rows-for-a-query-by-minute/8194088#8194088 – 2015-02-23 17:06:02

+0

关键细节:是否有每个值15分钟,你想要一个没有值的时间片的结果中的行吗?另外:你想查询完整的表格还是只是一个(小)选择 - 根据哪些标准过滤?最好的查询是由此决定的。 – 2015-02-23 17:09:10

回答

1

如果你的测试用例是你的真实情况的任何指示,您的时间戳已经落在15个分钟的间隔正好和你不需要到trunc()。只是一个普通的GROUP BY/avg()

SELECT date_time, avg(value) As avg_val 
FROM temperature te 
JOIN "time" ti USING (id_date) 
WHERE date_time >= '2015-02-24'::date 
AND  date_time < '2015-02-28'::date 
GROUP BY 1; 

选择从 '2015-02-24' 的3天时间片::日期为 '2015年2月27日' ::日期。请注意我如何包含更低的值并排除上限。另外:不要使用保留字“time”作为标识符。

+0

谢谢@Erwin它的工作:) – user26480 2015-02-26 08:41:51

0

每个季度创建一个组,然后用avg()聚合函数来计算平均每组温度:

select years 
,  months 
,  days 
,  hours 
,  floor(minutes/15) 
,  avg(value) 
from Temperature te 
join Time ti 
on  te.id_date = ti.id 
group by 
     years 
,  months 
,  days 
,  hours 
,  floor(minutes/15) 

或者更明确的替代方式来创建每季度一组:

group by 
     years 
,  months 
,  days 
,  hours 
,  case 
     when minutes < 15 then 1 
     when minutes < 30 then 2 
     when minutes < 45 then 3 
     else 4 
     end