如何选择 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 条件添加排序