2016-04-24 41 views
1

我正在查詢按日期查詢一組數據,但前提是過去7天的條件爲真。有條件的窗口函數sql

喜歡的東西,

SELECT 
category_name, 
entity_id 
FROM table_name 
WHERE 
condition_1 = True 
AND date_id <= current_date AND date_id >= current_date - 7 

但我想在同一時間查詢了多個日期ID的窗口。

比方說,我有

2016-01-01, foo, 123, True 
2015-12-31, foo, 123, False 
2015-12-26, foo, 123, True 
2015-12-31, bar, 12345, False 

並有日期,我會加入對諸如

2015-01-01, 
2015-01-02, 
... 

的標準表,因爲我的第一個表不會必然對每個

一天一個紀錄

我期望的結果是

2016-01-01, foo, 123, True 
2016-12-31, foo ,123, True 
2016-12-30, foo ,123, True 
2016-12-29, foo ,123, True 
2016-12-28, foo ,123, True 
2016-12-27, foo ,123, True 
2016-12-26, foo ,123, True 

由於這些是過去7天條件1爲真的日期。什麼是最好的方法來做到這一點?我試過類似

 SUM(condition_1) OVER (ORDER BY date_id 
      ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) 

隨着加入日期表(以確保我總是有一個dateid填充)。但是,我不確定這是否是最好的實現,並且我沒有得到正確的結果(仍在調試)。

+0

我不明白你的例子。你從4行開始,然後得到7? –

+0

是的,我需要加入日期表(虐待試圖編輯我的帖子有點清晰),因爲我的初始表不會有每個日期的記錄。 – jfalkson

+0

另外,用您正在使用的數據庫標記您的問題。 –

回答

2

我懷疑你想爲你的查詢left join

SELECT t.category_name, t.entity_id, 
     SUM(condition_1) OVER (ORDER BY c.date_id 
           ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 
          ) 
FROM calender c LEFT JOIN 
    table_name t 
    ON c.date_id = t.date_id AND t. condition_1 = True ; 

我不認爲SUM(condition_1)返回TRUE或FALSE - 也許MAX()或布爾OR聚集。但是,這就是你在這個問題上所做的。

+0

如果只有我可以在MySQL @Gordon Linoff中使用它們! – MontyPython

+0

@MontyPython。 。 。您始終可以切換到Postgres或支持它們的其他數據庫。 –

+0

你是對的,但MySQL對我來說工作得很好。不管怎樣,我都是按照我的方式工作。 – MontyPython