2017-08-16 6 views
1

の入手可能な最新の日付の列の合計:PostgreSQLのクエリ:このようになりますPSQLテーブルを考えると、毎月

date  | data 
2015-01-23 | 15 
2015-01-23 | 11 
2015-02-25 | 15 
2015-02-25 | 11 
2015-01-25 | 24 
2015-01-25 | 2 
2015-01-25 | 13 
2015-01-29 | 5 
2015-02-28 | 12 
2015-02-28 | 1 
2015-05-15 | 12 
2015-05-16 | 1 

は、どのように私は、各月の最後の利用可能日付のデータの合計値を得ることができますか? 例の結果:

SELECT year,month,max(day),sum(data) FROM 
    (
    SELECT 
     date, 
     date_part('year', date) AS year, 
     date_part('month', date) AS month, 
     date_part('day', date) AS day, 
     sum(data)    AS tdata 
    FROM table a 
    GROUP BY date, date_part('year', date), date_part('month', date), date_part('day', date) 
    ORDER BY year ASC, month ASC, day ASC 
) dataq 
GROUP BY year,month 

私はここから入手合計が間違っていると表示されます。

date  | data 
2015-01-29 | 5 
2015-02-28 | 13 
2015-05-16 | 1 

これは私がこれまで試したものです。

+1

関連のない製品にタグを付けないでください。 – Strawberry

答えて

1

あなたが一日でグループ化し、内側のクエリで合計を計算する必要があります。外部クエリで月の最新日を選択:

select distinct on (year, month) 
    make_date(year::int, month::int, day::int) as date, 
    data 
from (
    select 
     date_part('year', date) as year, 
     date_part('month', date) as month, 
     date_part('day', date) as day, 
     sum(data) as data 
    from my_table 
    group by date 
    ) s 
order by year, month, day desc 

    date | data 
------------+------ 
2015-01-29 | 5 
2015-02-28 | 13 
2015-05-16 | 1 
(3 rows)  
+0

ありがとう、これは素晴らしい作品です。 – r1pster

1

私はあなたが合計したくない日数を削除する必要があると思います。次のようにNOT EXISTSを使用した例:

SELECT year,month,max(day),sum(tdata) tdata FROM 
    (
    SELECT 
     d, 
     date_part('year', d) AS year, 
     date_part('month', d) AS month, 
     date_part('day', d) AS day, 
     sum(data)    AS tdata 
    FROM tab a 
    WHERE NOT EXISTS 
    (
     SELECT * 
     FROM tab a2 
     WHERE date_part('year', a.d) = date_part('year', a2.d) AND 
      date_part('month', a.d) = date_part('month', a2.d) AND 
      date_part('day', a.d) < date_part('day', a2.d) 
    ) 
    GROUP BY d, date_part('year', d), date_part('month', d), date_part('day', d) 
    ORDER BY year ASC, month ASC, day ASC 
) dataq 
GROUP BY year,month 

SQLFiddle

+0

ありがとうございます。これは動作しますが、何らかの理由で非常に遅いです。 500k行の表で実行するのに約15秒かかります。 – r1pster

関連する問題