2017-06-12 217 views
0

我在我的PostgreSQL 9.5数据库中有一个包含小时数据的表my_data。样本数据如下:如何在PostgreSQL中将每小时数据汇总为每日,每周,每月和每年的值?

ID Date  hour value 
1 01/01/2014 1  9.947484 
2 01/01/2014 2  9.161652 
3 01/01/2014 3  8.509986 
4 01/01/2014 4  7.666654 
5 01/01/2014 5  7.110822 
6 01/01/2014 6  6.765822 
7 01/01/2014 7  6.554989 
8 01/01/2014 8  6.574156 
9 01/01/2014 9  6.09499 
10 01/01/2014 10  8.471653 
11 01/01/2014 11  11.36581 
12 01/01/2014 12  11.25081 
13 01/01/2014 13  9.391651 
14 01/01/2014 14  6.976655 
15 01/01/2014 15  6.574156 
16 01/01/2014 16  6.420823 
17 01/01/2014 17  6.229156 
18 01/01/2014 18  5.577491 
19 01/01/2014 19  4.964159 
20 01/01/2014 20  6.593323 
21 01/01/2014 21  7.321654 
22 01/01/2014 22  9.295818 
23 01/01/2014 23  8.241653 
24 01/01/2014 24  7.014989 
25 02/01/2014 1  6.842489 
26 02/01/2014 2  7.513321 
27 02/01/2014 3  7.244988 
28 02/01/2014 4  5.80749 
29 02/01/2014 5  5.481658 
30 02/01/2014 6  6.669989 
.. ..   ..  .. 

等等。这些数据以相同的方式存在多年。上表的结构是:ID(整数序列不为空),日期(日期)(mm/dd/yyyy),小时(整数),值(数值)。对于上述大量数据,我如何在PostgreSQL中查找每日,每周,每月和每年的平均值?

回答

1

您使用聚合。例如:

select date, avg(value) 
from t 
group by date 
order by date; 

至于其它,使用date_trunc()

select date_trunc('month', date) as yyyymm, avg(value) 
from t 
group by yyyymm 
order by yyyymm; 

这假定date存储为date数据类型。如果以字符串形式存储,则应该在数据中修复数据类型。您可以使用to_date()将其转换为日期。

+0

第一个案件工作正常,但月平均。它修复了如下日期:2014-01-01,2014-02-01,2014-03-01,2014-04-01而不是代码中指定的yyyymm?日期值存储为日期。 –

+0

@JibranKhan。 。 。 'date_trunc()'返回该月的第一天。我只是称它为'yyyymm'来表示它代表了一个月。 'to_char(date,'YYYY-MM')'也可以使用。 –

+0

是的,谢谢。修复 –

相关问题