首页 > 解决方案 > 将重叠或连续的日期值与 match_recognize 相结合

问题描述

尝试使用 match_recognise 组合或合并重叠日期值时,我很难获得正确答案。以下链接中的示例解释了我正在尝试做的事情,但在某些情况下我的数据不足:

https://livesql.oracle.com/apex/livesql/file/tutorial_E4DB2E0Z0D5ZTUBGN6JWUPKAU.html

基本上我有一组数据,其中的日期值有时会相互重叠。可以重叠的日期范围没有限制,我会在日期中看到一些变化:

总之,这些是主要的变化:

  1. 只有一个单一的日期实例,所以会作为单行返回(例如来自分类器的 strt/a)
  2. 按顺序相互重叠的日期
  3. 相互重叠的日期,但也有一组日期大于所有其他日期

这是一个例子:

日期范围:

开始 结尾
26-8-16 13:14:00 16 年 10 月 19 日 15:38:31
16 年 8 月 26 日 13:14:03 16 年 11 月 1 日 19:14:51
16 年 8 月 26 日 13:15:01 16 年 10 月 19 日 15:39:11
16 年 10 月 21 日 15:38:03 16 年 10 月 24 日 06:01:35
16 年 10 月 24 日 14:26:02 16 年 10 月 31 日 14:14:53

使用上面链接中代码的略微修改版本:

select *
  from periods
match_recognize(
   order by end_date, start_date
   measures
      first(start_date) start_date, last(end_date) end_date
    , count(*) periods
    , match_number() match_no
    , classifier() class
   one row per match
   pattern( a b* )
   define
      b as start_date <= prev(end_date)
)

我得到以下信息:

开始日期 结束日期 期间 MATCH_NO 班级
26-8-16 13:14:00 16 年 10 月 19 日 15:39:11 2 3
16 年 10 月 21 日 15:38:03 16 年 10 月 24 日 06:01:35 1 4 一个
16 年 10 月 24 日 14:26:02 16 年 11 月 1 日 19:14:51 2 5

我希望将 2016 年 8 月 26 日的最小开始日期和 2016 年 11 月 1 日的最大结束日期作为单行返回,以表示最小/最大开始和结束日期。

在使用代码时,我可以找到一种方法让它在这个例子中工作,但它反过来又破坏了其他例子。所以我认为我需要为它定义更多的模式来寻找,但是很难让它按照我想要的方式工作并理解我需要定义的模式。

提前致谢...

标签: sqloracleplsql

解决方案


推荐阅读