2016-03-21 13 views
1

Oracle'daki tablodaki veri girişi aşağıdaki gibidir. Bu, başlangıç_tarihi bir satırda, ancak bitiş_tarihi bir hesap numarası için sonraki satırda. Başlangıç ​​tarihini ve bitiş tarihini aynı satırda hizalamak istersiniz. Kurşun işlevini kullanmayı denedim ve işe yaramıyor. Oracle 11g kullanıyorum. Lütfen bana bunda yardım eder misin.Start_date öğesini ve ilgili end_date öğesini nasıl seçerim

ACCT_NUM ACTV_TMST START_DATEEND_DATE

1234 11/22/2006 2: 12: 13,928230 PM 2006/11/22 00:00:00 BOŞ

1234 11/28/2006 7: 35: 05,659595 AM BOŞ 11/28/2006

1234 12/22/2008 3: 00: 47,864811 PM 12/22/2008 00:00:00 BOŞ

1234 12/26/2008 3: 34: 28,776394 PM NULL 12/26/2008 00:00:00

1234 02/18/2016 9: 22: 35.746829 AM 02/18/2016 00:00:00 NULL

1234 02/23/2016 9: 03: 35.295622 AM NULL 02/23/2016 00:00:

00 Ben

1234 11/22/2006 00:00:00 11/28/2006 00:00:00

1234 12/22/2008 00 END_DATE ACCT_NUM START_DATE gibi bir çıktı gerekir : 00: 00 12/26/2008 00:00:00

1234 02.08.2016 00:00:00 02/23/2016 00:00:00

Teşekkürler.

cevap

1

Sen ORACLE'ın satırnum pencere işlevini kullanabilirsiniz: Bu temelde her satır sıralaması olacaktır

SELECT s.acct_num, 
     max(s.start_date) as start_date, 
     max(s.end_date) as end_date 
FROM(
    SELECT t.acct_num, 
      t.start_date, 
      row_number() OVER(PARTITION BY t.acct_num ORDER BY t.start_date) as sd_rnk, 
      t.end_date, 
      row_number() OVER(PARTITION BY t.acct_num ORDER BY t.end_date) as ed_rnk 
    FROM YourTable t) s 
GROUP BY acct_num, 
     CASE WHEN t.start_date is null then ed_rnk else sd_rnk end 

, ilk START_DATE 1, Same 2. alacak ikinci ilk alacak, end_date için de geçerli 1 saniye 2 ...

Daha sonra, bu sonuçlara göre gruplanacaksınız (acct_num, end_date_rank/start_date_rank) ve bunları bir satırda birleştirmek için bir toplama işlevi kullanın.

+0

Cevabınız için çok teşekkürler. İşe yaradı. – manj

İlgili konular