2017-04-10 13 views
0

私はdate_truncを使ってタイムスタンプフィールドに集計しています。私は与えられたフィールドの一意の値の数を数ヶ月にわたって数えようとしています。私は私の解像度としてmonthを選択した場合:date_truncを使用したローリング平均

SELECT date_trunc('month', timestamp), COUNT(DISTINCT(foo)) FROM ... 

、すべての結果のエントリは、各月の初めにであるので、「2017年1" 月1日はtimestampフィールドは1月のどこにある一意のエントリを数えることになります。

2017年2月15日までのエントリを含んで、私は2017年1月15日のエントリを持っているかもしれないというようなオフセットを指定することが方法です?

感謝。

+1

サンプルデータ。期待される出力。 –

答えて

0
SELECT 
    date_trunc('month', timestamp + interval '15 day'), 
    COUNT(DISTINCT(foo)) 
FROM ... 
group by 1 
0

この種のクエリはあまり効率的ではありません。速度が問題であれば、アプリケーション言語でループすることでデータベース外でこれを行うほうが良いでしょう。

サブクエリでは、すべてのレコードに対して、それを集計に含める一連の日付を生成し、生成された日付で集計します。また

SELECT 
    mydate 
    , COUNT(DISTINCT foo) 
FROM (SELECT GENERATE_SERIES(DATE("timestamp") - INTERVAL '30 DAYS' 
          , DATE("timestamp"), '1 DAY') mydate 
      , foo 
     FROM mytable) expanded 
GROUP BY 1 

、そのPostgreSQLのデータ型として、列名としてtimestampを使用しないようにしてみてください。

関連する問題