如何选择start_date和相应的end_date

时间:2016-03-21 14:03:38

标签: sql oracle oracle11g

Oracle中表格中的数据输入如下。即start_date在一行中,但end_date在帐号的下一行。想要将开始日期和结束日期对齐在同一行中。我尝试使用铅功能,它似乎不起作用。我正在使用Oracle 11g。能帮帮我吧。

ACCT_NUM ACTV_TMST START_DATE END_DATE

1234 11/22/2006 2:12:13.928230 PM 11/22/2006 00:00:00 NULL

1234 11/28/2006 7:35:05.659595 AM NULL 11/28/2006

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

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

我需要一个类似的输出 ACCT_NUM START_DATE END_DATE

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

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

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

感谢。

1 个答案:

答案 0 :(得分: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行。