2016-03-25 23 views
2

Bu formatında veri var:tarih kriterler kullanılarak sıralı bir bayrak oluşturma

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 

ben bir satır bitiş tarihi ise bir dizenin parçası olarak kabul edip 'string_num' adlı bir alan oluşturmak istiyoruz önceki satırın (id ve start_date tarafından sipariş edilen) mevcut satırın başlangıç ​​tarihinden itibaren 7 gün içinde olması gerekir. Sonunda şöyle olurdu:

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 

Bunun için yinelemeli bir sorgu kullanmalı mıyım?

+0

Hangi DBMS kullanıyorsunuz? –

+0

@a_horse_with_no_name Bir Oracle veritabanına bağlanmak için sql geliştiricisini kullanıyorum – staplertape

+0

Hmmm. . . Boole ("if") olan mantığı tanımlarsınız ve "string_id" diye bir şey çağırırsınız. İstediğiniz sonuçların bir tamsayı ve 'string_num' denen bir şey var. Lütfen soruyu açıklığa kavuşturun. –

cevap

1

Bunu analitik işlevlerle yapabilirsiniz. Önceki tarihi almak için LAG() kullanılır. Sonra bazı mantıksal bir toplam yapmak için SUM() kullanın:

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

Teşekkürler, bu tam olarak ihtiyacım olan şey. – staplertape

İlgili konular