2017-07-17 803 views
1

我有两个我想实现的查询。Postgres SQL查询 - 每月的平均值

我有一个表是这样的...

Date  | Period | Location | Price 
2017-01-01  1   A   10 
2017-01-01  2   A   15 
2017-01-01  1   B   15 
2017-01-01  2   B   16 

每个日期有48个读数(每半小时)。

问题1:我希望得到的平均价格的日期范围按以下格式中的任何给定的位置:

例如与2017年1月1日和2017年6月30日,每期平均价格为位置“A”

Period 1 | Period 2| Period 3 ... 
     10   11   15 

问题2:我希望有平均价格为任何给定的位置要回个月的X号: (期间无所谓)

Month | Average price 
january  10 
february  12 
march   16 

任何帮助,将不胜感激:)

+0

你尝试过什么到目前为止? – Jacobm001

+0

这里有两个截然不同的问题。我建议你单独问问他们。 – Jacobm001

+0

你有没有尝试过任何东西?..看起来相当简单'select'查询全部是需要的 –

回答

0

你列出的第二个查询是一个非常简单的操作group by。唯一有点棘手的是你需要从列出的日期中提取月份。

select 
    date_part('month', t.Date) as month 
    avg(t.Price) as average_price 
from 
    mytable t 
group by 
    date_part('month', t.Date) 

第一个查询但是是显著更复杂。它涉及crosstab(),如果您尚未启用数据库,则必须启用它。总体思路是计算每个时期的平均值,然后像在Excel中一样调整数据。

select * from crosstab(
' select 
     t.Period 
     , avg(t.Price) as avg_price 
    from 
     mytable t 
    group by 
     t.Period 
    order by 
     1 
     , 2 
' 
) as ct(
    "Period" text 
    , "1" int 
    , "2" int 
    , "3" int 
    , "4" int 
    , "5" int 
    , "6" int 
    , "7" int 
    , "8" int 
    , "9" int 
    , "10" int 
    , "11" int 
    , "12" int 
) 

answer具有的信息大量的Postgre的crosstab()

+0

感谢您的回复。虽然我收到以下错误... 错误:无效的源数据SQL语句 细节:提供的SQL必须返回3列:rowid,类别和值。 ********** **********错误 错误:无效的源数据的SQL语句 SQL状态:22023 详细信息:所提供的SQL必须返回3列:ROWID,类别和价值。 – Daryn