2016-03-25 7 views
2

日付基準を使用して注文した旗を作成:私はこの形式であるデータ持っ

id start_date end_date 
25 1-Jan-00 24-Jan-00 
25 26-Jan-00 5-Feb-00 
25 3-Nov-00 6-Mar-01 
25 10-Mar-01 4-Jun-02 
25 2-Jul-03 6-Aug-03 
93 2-May-14 4-May-14 
93 8-May-14 6-Aug-14 
93 9-Aug-14 1-Feb-15 
93 3-Feb-15 14-Mar-15 
93 9-Jul-15 1-Dec-15 
93 2-Mar-16 7-Mar-16 
93 2-Apr-16 1-May-16 

を私は終了日場合、行は文字列の一部とみなして「string_num」と呼ばれるフィールドを作成したいです(idとstart_dateで順序付けられた)前の行の現在の行の開始日から7日以内です。それは最後に次のようになります。

id start_date end_date string_num 
25 1-Jan-00 24-Jan-00 1 
25 26-Jan-00 5-Feb-00 1 
25 3-Nov-00 6-Mar-01 2 
25 10-Mar-01 4-Jun-02 2 
25 2-Jul-03 6-Aug-03 3 
93 2-May-14 4-May-14 1 
93 8-May-14 6-Aug-14 1 
93 9-Aug-14 1-Feb-15 1 
93 3-Feb-15 14-Mar-15 1 
93 9-Jul-15 1-Dec-15 2 
93 2-Mar-16 7-Mar-16 3 
93 2-Apr-16 1-May-16 4 

私はこのために再帰クエリを使用する必要がありますか?

+0

どのDBMSを使用していますか? –

+0

@a_horse_with_no_name私はSQLデベロッパーを使用してOracleデータベースに接続しています – staplertape

+0

Hmmm。 。 。ブール論理( "if")を定義し、 'string_id'を呼び出します。あなたの望む結果は整数と 'string_num'と呼ばれるものを持っています。質問を明確にしてください。 –

答えて

1

これは、分析関数で行うことができます。 LAG()は、前の日付を取得するために使用されます。次に、SUM()を使用して、いくつかのロジックで累積合計を行います。

select t.*, 
     sum(case when prev_end_date + 7 >= start_date then 0 else 1 
      end) over (partition by id order by start_date) as string_num 
from (select t.*, 
      lag(end_date) over (partition by id order by start_date) as prev_end_date 
     from t 
    ) t; 
+0

ありがとう、これは私が必要としていたものです。 – staplertape

関連する問題