Oracle 19c version

不确定是否有可能编写一个查询来实现我所要求的,但不想在没有与专业人士核实的情况下排除这一可能性!

我试图在dbfiddle&sqlfiddle中创建这个表&data,但是遇到了错误.以下是 playbook .

create table xxtest (
  person_number   number,
  full_name       varchar2(100),
  grade           varchar2(10),
  st_date         date,
  end_date        date
);

insert into xxtest values (1,'John Doe','E02',to_date('2023-01-01','YYYY-MM-DD'),to_date('2023-01-23','YYYY-MM-DD'));
insert into xxtest values (1,'John Doe','E02',to_date('2023-01-30','YYYY-MM-DD'),to_date('2023-02-28','YYYY-MM-DD'));
insert into xxtest values (1,'John Doe','E02',to_date('2023-03-01','YYYY-MM-DD'),to_date('2023-03-12','YYYY-MM-DD'));
insert into xxtest values (1,'John Doe','E02',to_date('2023-03-15','YYYY-MM-DD'),to_date('2023-03-31','YYYY-MM-DD'));
insert into xxtest values (1,'John Doe','E02',to_date('2023-04-01','YYYY-MM-DD'),to_date('2023-12-31','YYYY-MM-DD'));
insert into xxtest values (1,'John Doe','N01',to_date('2023-01-24','YYYY-MM-DD'),to_date('2023-01-29','YYYY-MM-DD'));

select a.*, a.end_date-a.st_date days
from xxtest a;

因此,数据如下所示:

enter image description here

预期yields 如下所示.按人员、姓名和级别,如果日期没有中断,则应汇总这些行,并具有st_date和amp;end_date之间的天数之和.

我已经对上面的行进行了 colored颜色 编码,并显示为curl 在下面的图像.

enter image description here

一如既往,衷心感谢您的帮助!

推荐答案

select *
  from xxtest a
match_recognize(
  partition by person_number,full_name,grade
  order by st_date
  MEASURES 
     first(st_date) as dt_start,
     last(end_date) as dt_end,
     sum(end_date-st_date) as days
  PATTERN (st nxt*) 
  DEFINE 
    nxt AS st_date = prev(end_date)+1
);

数据库菲德尔:https://dbfiddle.uk/ov7LzObI

PERSON_NUMBER   FULL_NAME   GRADE   DT_START    DT_END      DAYS
1               John Doe    E02     01-JAN-23   23-JAN-23   22
1               John Doe    E02     30-JAN-23   12-MAR-23   40
1               John Doe    E02     15-MAR-23   31-DEC-23   290
1               John Doe    N01     24-JAN-23   29-JAN-23   5

Sql相关问答推荐

SQL(PostgreSQL)从条件创建点表

用于匹配红旗和绿旗的SQL查询

如何在联接条件不匹配时按日期获取上一条记录

提高写密集型表的查询性能

查找表中特定值的上次更新日期

用户购买平台及金额统计

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

用VB.NET在Dapper中实现MS Access数据库顺序透视

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

违反了完整性约束-值存在时找不到父键

将最近的结束日期与开始日期相匹配

PostgreSQL-用第一个非空填充以前的值

如何在 case 语句中使用聚合?

BigQuery导航函数计算ID

一次 Select 语句中按组累计的SQL累计数

带有数组输入参数的Snowflake UDF优化

所有列分组的简写?

以 15 分钟为间隔的使用情况SQL 查询

如何使用子查询锁定此查询中的选定行?