如何选择 start_date 和相应的 end_date

Posted

技术标签:

【中文标题】如何选择 start_date 和相应的 end_date【英文标题】:How do I select start_date and corresponding end_date 【发布时间】:2016-03-21 14:03:38 【问题描述】:

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 上午 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 空

1234 02/23/2016 9:03:35.295622 上午 NULL 02/23/2016 00:00:00

我需要像这样的输出 ACCT_NUM START_DATE END_DATE

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

1234 2008 年 12 月 22 日 00:00:00 2008 年 12 月 26 日 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 行。

【讨论】:

以上是关于如何选择 start_date 和相应的 end_date的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 8 从 url 中获取动态 start_date 和 end_date(日期范围)?

SQL如何从2个单独的列start_date和end_date中获得月度趋势?

如何在 django 中向 Case、When 条件添加排序

记录少于 2 列之间的平均天数

Laravel 5.3 验证:由两列(start_date,end_date)设置的唯一周期时间

Django按日期范围过滤但不包括年份