2016-03-21 7 views
1

Oracleの表に入力されたデータは、次のとおりです。つまり、start_dateは1行にありますが、end_dateはアカウント番号の次の行にあります。開始日と終了日を同じ行に揃えたい私は鉛の機能を使用してみましたが、それは動作していないようです。私はOracle 11gを使用しています。これで私を助けてもらえますか?start_dateと対応するend_dateの選択方法

のacct_num ACTV_TMST START_DATE END_DATE

1234 2006年11月22日2:12:13.928230 PM 2006年11月22日0時00分00秒NULL

1234 2006年11月28日7:35:05.659595 AM NULL 2006年11月28日

1234 2008年12月22日3:00:47.864811 PM 2008年12月22日夜12時00分00秒NULL

1234 2008年12月26日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:私は のacct_num START_DATE END_DATE

1234 2006年11月22日夜12時00分00秒2006年11月28日夜12時00分00秒

1234 2008年12月22日00のような出力を必要とする00

:00:00 12/26/2008 00:00:00

1234 02/18/2016 00:00:00 02/23/2016 00:00:00

ありがとうございました。

答えて

1

は、OracleのROW_NUMBERのウィンドウ関数を使用することができます。これは、基本的にそれぞれの行をランク付けします

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 

、最初start_dateの1は、同じ2を取得する第二は、最初のでしょう、END_DATEのために行く1秒2 ...

この結果(acct_num、end_date_rank/start_date_rank)でグループ化し、集計関数を使用してそれらを1行に統合します。

+0

お返事ありがとうございました。出来た。 – manj

関連する問題