2017-04-10 62 views
0

我使用date_trunc在時間戳字段上進行聚合。我試圖計算一個月內給定字段中唯一值的數量。如果讓我選擇month爲我的決心:使用date_trunc的滾動平均值

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

那麼所有的結果條目是在每個月初,所以「2017年1" 月1日將被計數的唯一條目,其中timestamp場是在一月的任何地方。

是否有指定的偏移,使得我有可能在2017年1月15日的條目的方式,包括項目達2017年2月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 

另外,請儘量不要使用timestamp作爲列名作爲其一個PostgreSQL的數據類型。