我的oracle表中有数据,其中有如下名称和日期范围:

Name                From        To
Lopes, Janine       07-Jun-17   16-Jul-17
Lopes, Janine       17-Jul-17   23-Jul-17
Lopes, Janine       24-Jul-17   31-Aug-17
Baptista, Maria     23-Dec-16   19-Feb-17
Deyak,Sr, Thomas    22-Jan-17   18-Apr-17
Deyak,Sr, Thomas    27-Apr-17   14-May-17
Deyak,Sr, Thomas    15-May-17   21-May-17
Deyak,Sr, Thomas    22-May-17   28-May-17
Deyak,Sr, Thomas    29-May-17   31-May-17
Serrentino, Joyce   18-Mar-17   30-Apr-17
More, Cathleen      30-Jul-17   13-Aug-17
More, Cathleen      14-Aug-17   20-Aug-17
More, Cathleen      21-Aug-17   27-Aug-17
More, Cathleen      28-Aug-17   03-Sep-17
More, Cathleen      04-Sep-17   10-Sep-17
More, Cathleen      11-Sep-17   24-Sep-17
Barrows, Michael    30-Jan-17   19-Mar-17
Barrows, Michael    20-Mar-17   26-Mar-17
Barrows, Michael    27-Mar-17   02-Apr-17
Barrows, Michael    03-Apr-17   07-Apr-17

通常,对于一个用户而言,迄今为止比日期大一,并且是连续的,但是在某些情况下,数据中断,因此我的输出应如下所示:
Name                From            To
Lopes, Janine       07-Jun-17   31-Aug-17
Baptista, Maria     23-Dec-16   19-Feb-17
Deyak,Sr, Thomas    22-Jan-17   18-Apr-17
Deyak,Sr, Thomas    27-Apr-17   31-May-17
Serrentino, Joyce   18-Mar-17   30-Apr-17
More, Cathleen      30-Jul-17   24-Sep-17
Barrows, Michael    30-Jan-17   07-Apr-17

如果我执行min(from)和max(to),则会丢失一些类似Thomas的记录。
我需要如何编写sql来获取数据。

最佳答案

在Oracle 12.1和更高版本中,the MATCH_RECOGNIZE子句可以快速满足此类要求。我从其他答案中使用了相同的设置和模拟数据(WITH子句),并且输出也相同。

select name, date_fr, date_to
from   inputs
match_recognize(
  partition by name
  order by date_fr
  measures a.date_fr     as date_fr,
           last(date_to) as date_to
  pattern ( a b* )
  define b as date_fr = prev(date_to) + 1
)
;

关于sql - 按名称和日期范围对数据进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46528442/

10-09 15:54
查看更多