2016-08-04 2 views
0

連続する日付ブロックの数をランク付けしようとしていますが、これを実行する最も良い方法は何ですか?以下の例は、最初の3つのブロックが連続していることを示しており、4つのブロックの間に月があるため、カウントが再び開始されます。連続した日付ブロックによるSQLランキング

データ私が注文しようとしている:

StartDate | EndDate |Rank 
    ----------+-----------+---- 
    01/01/2016| 01/02/2016| 1 
    01/02/2016| 01/03/2016| 2 
    01/03/2016| 01/04/2016| 3 
    01/05/2016| 01/06/2016| 1 
+0

期待される出力は? – jonju

答えて

1

あなたは、グループ化が始まるグループを識別するために、累積和をやって、識別することによってこれを行うにして、行番号ことができます。

select t.*, 
     row_number() over (partition by grp order by startdate) as rank 
    from (select t.*, 
       sum(case when tprev.startdate is null then 1 else 0 end) over (order by startdate) as grp 
     from t left join 
      t tprev 
      on t.startdate = tprev.enddate 
     ) t; 

この特定のSQLは、提示したデータに対して機能します。 1日以上重複するデータや、同じ日に開始する複数のレコードは処理されません。これらは扱うことができます。あなたのデータがそれより似ている場合は、別の質問にと質問してください。

+0

これはうまくいくと思いますが、私は最後にこのようにしていませんが、私はまだランクとケースステートメントを使用していますが、このステープルの後に内部オーダーパーツを使用しませんでした。彼らが同じかどうかを見るために開始日と終了日に加わりました。ありがとう – user3691566

関連する問題