2016-03-21 26 views
1

Oracle中表格中的數據輸入如下。這是start_date在一行中,但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 00:00:00 NULL

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

1234 12/22/2008 3:00:47.864811 PM 12/22/2008 00:00:00 NULL

1234 2008年12月26日3:34:28.776394 PM NULL 12/26/2008 00:00:00

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

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

我需要一個像 ACCT_NUM START_DATE輸出END_DATE

1234 2006/11/22 00:00:00 2006年11月28日00:00:00

1234 12/22/2008 00 :00:00 12/26/2008 00:00:00

1234 2016/02/18 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 

這將基本上排每排,第一起始日期1,第二次將得到2,同去的END_DATE,首先將獲得1秒2 ...

然後,您將按此結果進行分組(acct_num,end_date_rank/start_date_rank)並使用聚合函數將它們合併爲一行。

+0

非常感謝您的回答。有效。 – manj

相關問題