oracle 从行级数据创建时间轴

ymzxtsji  于 2023-02-18  发布在  Oracle
关注(0)|答案(2)|浏览(176)

我仍然是一个SQL新手,所以我打算试试这个。希望有人能帮助!我有以下数据集:

image
| 要求数量|日期|事件|用户输入|
| - ------|- ------|- ------|- ------|
| 小行星23877|2022年3月24日00时00分00秒|张贴|约翰|
| 小行星23877|2022年4月3日00时00分00秒|过期|约翰|
| 小行星23877|2022年5月3日00时00分00秒|张贴|简|
| 小行星23877|2022年5月9日00时00分00秒|过期|简|
| 小行星23877|2022年5月27日00时00分00秒|张贴|约翰|
| 小行星23877|2022年6月17日00时00分00秒|未过帐|约翰|
基本上,我尝试做的是为每个开始(已发布)和结束(过期、未发布)日期创建一行,如下所示:
| 要求数量|开始日期|结束日期|
| - ------|- ------|- ------|
| 小行星23877|2022年3月24日00时00分00秒|2022年4月3日00时00分00秒|
| 小行星23877|2022年5月3日00时00分00秒|2022年5月9日00时00分00秒|
| 小行星23877|2022年5月27日00时00分00秒|2022年6月17日00时00分00秒|
这将用于计算两个阶段之间的时间,以及实际发布申请供候选人申请时的趋势。
我想我需要使用某种循环,但老实说我甚至不知道从哪里开始。我试过搜索,但我不认为我真的知道要搜索什么,所以即使只是一个线索,我需要寻找会有帮助。
我很感激你能提供的任何帮助!
我想也许是一个分组与最小和最大日期,但有差距之前,请购单甚至再次张贴,所以这是误导。

hs1ihplo

hs1ihplo1#

我假设您使用的是当前支持的Oracle版本,因此它应该支持match_recognize

select *
from your_table
match_recognize (
   partition by req_num
   order by trans_date
   measures
      first(trans_date) as start_dt,
      last(trans_date)  as end_dt,
      last(event)       as end_event
   pattern (start_ next_+)
   define
     start_ as (event='Posted'),
     next_ as (event!='Posted')
)

完整的DBFiddle示例:https://dbfiddle.uk/4Fai2-ZQ

oalqel3c

oalqel3c2#

如果您的实际数据看起来像问题中的那样-您可以使用条件LAG() and LEAD() analytic functions在同一行中获取开始和结束日期。

SELECT DISTINCT 
          REQ_NUM,  
          CASE WHEN EVENT  = 'Posted' THEN A_DATE ELSE LAG(A_DATE)  OVER(Order By REQ_NUM, A_DATE) END "START_DT", 
          CASE WHEN EVENT != 'Posted' THEN A_DATE ELSE LEAD(A_DATE) OVER(Order By REQ_NUM, A_DATE) END "END_DT"
FROM      tbl

......通过样本数据......

WITH
    tbl (REQ_NUM,   A_DATE, EVENT,  USER_ENTR) AS
        (
            Select  23877,  To_Date('2022-03-24', 'yyyy-mm-dd'),    'Posted',   'John' From Dual Union All
            Select  23877,  To_Date('2022-04-03', 'yyyy-mm-dd'),    'Expired',  'John' From Dual Union All
            Select  23877,  To_Date('2022-05-03', 'yyyy-mm-dd'),    'Posted',   'Jane' From Dual Union All
            Select  23877,  To_Date('2022-05-09', 'yyyy-mm-dd'),    'Expired',  'Jane' From Dual Union All
            Select  23877,  To_Date('2022-05-27', 'yyyy-mm-dd'),    'Posted',   'John' From Dual Union All
            Select  23877,  To_Date('2022-06-17', 'yyyy-mm-dd'),    'Unposted', 'John' From Dual 
        )

.应导致:

REQ_NUM START_DT  END_DT  
---------- --------- ---------
     23877 24-MAR-22 03-APR-22 
     23877 03-MAY-22 09-MAY-22 
     23877 27-MAY-22 17-JUN-22

注:DISTINCT关键字可消除重复行,对于大型数据集,这可能会导致性能成本过高。

相关问题