2012-08-27 16 views
1

我有一個Postgres表,我試圖根據某些日期列進行分析。爲每一行添加一個符合期間標準的地方

我基本上試圖計算我的表中滿足此要求的行數,然後按月份和年份對它們進行分組。相反,我的查詢看起來像這樣:

SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' 
         and date2::date > '2012-05-31'; 

它應該可以在我的資料提供月份顯示,這樣我就不必每次添加新數據時手動更改幾個月,等我可以通過一個查詢獲取所有內容。

在上述情況下我也喜歡這組符合標準到2012年和月05.同樣,行的總和,如果我的WHERE子句是這樣的:

date1::date <= '2012-06-31' and date2::date > '2012-06-31' 

我d喜歡它把這個數額分成2012年和06年。

回答

-1

聽起來好像你可以從DATEPART T-SQL方法中受益。如果我理解正確,你可以這樣做:

SELECT DATEPART(year, date1) Year, DATEPART(month, date1) Month, SUM(value_col) 
FROM $Table 
-- WHERE CLAUSE ? 
GROUP BY DATEPART(year, date1), 
    DATEPART(month, date1) 
+1

甚至它[PostgreSQL等效](http://www.postgresql.org/docs/current/static/functions-datetime.html),'date_part('年',date1)'和'date_part('month',date1)'...... – ig0774

+0

PostgreSQL中沒有'DATEPART',這個答案是錯誤的。 –

0

這是推理。首先,創建一個所有可能日期的列表。然後獲得date1的累計數字,直到給定日期。然後獲取日期後的日期2的累計數字並減去結果。下面的查詢執行此操作使用相關子查詢(不是我喜歡的概念,但是方便在這種情況下):

select thedate, 
     (select count(*) from t where date1::date <= d.thedate) - 
     (select count(*) from t where date2::date > d.thedate) 
from (select distinct thedate 
     from ((select date1::date as thedate from t) union all 
      (select date2::date as thedate from t) 
      ) d 
    ) d 

這是假設date2的發生日期1之後。我的模型是客戶的開始和結束日期。如果情況並非如此,則查詢可能無效。

1

這並不完全清楚,我:

我也想組行

我會這樣理解的總和:要列出所有行「每月」匹配標準:

WITH x AS (
    SELECT date_trunc('month', min(date1)) AS start 
      ,date_trunc('month', max(date2)) + interval '1 month' AS stop 
    FROM tbl 
    ) 
SELECT to_char(y.mon, 'YYYY-MM') AS mon, t.* 
FROM (
    SELECT generate_series(x.start, x.stop, '1 month') AS mon 
    FROM x 
    ) y 
LEFT JOIN tbl t ON t.date1::date <= y.mon 
       AND t.date2::date > y.mon -- why the explicit cast to date? 
ORDER BY y.mon, t.date1, t.date2; 

假設date2 >= date1

  1. 計算下和時間段的上邊界和截斷到一個月(加1上邊界,包括最後一排了。

  2. 使用generate_series()於有關

  3. 創建一套月從表中
  4. LEFT JOIN行與申報標準和排序個月。

你湊在這個階段ld也GROUP BY計算聚合..

相關問題