2016-04-24 7 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が真である日付なので、これを行う最善の方法は何ですか?私は(私は常に人口dateidを持っていることを確認するため)、日付テーブルに参加するとともに

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

のようなものを試してみました。しかし、これが最良の実装であるかどうかわからず、正しい結果が得られていない(まだデバッグ中)。

+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)リターンとは思わない - おそらくMAX()または集約ブールORを。しかし、それはあなたが質問に入れたものです。

+0

MySQL @Gordon Linoffでこれらを使用できるのであれば! – MontyPython

+0

@MontyPython。 。 。 Postgresやそれをサポートする別のデータベースにいつでも切り替えることができます。 –

+0

あなたは正しいですが、MySQLはうまく動作します。私は何とか周りを歩いています。 – MontyPython