2016-04-24 38 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