2017-07-17 1 views
1

私は達成したい2つのクエリを持っています。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分毎)を持っています。

クエリ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

ここでは2つの異なる質問があります。私はそれらを別々に尋ねることをお勧めします。 – Jacobm001

+0

何か試しましたか?..かなり簡単に見える 'select'クエリがすべて必要です –

答えて

0

あなたが記載されている2番目のクエリは非常に単純な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文 DETAIL:指定されたSQLは、rowid、category、およびvaluesの3つの列を返す必要があります。 ********** **********エラー ERROR:無効なソースのデータのSQL文 SQL状態:22023 詳細:提供SQLは3列を返す必要があります:ROWIDを、カテゴリ、および値。 – Daryn