Plsql 分析事件发生的SQL时间序列

Plsql 分析事件发生的SQL时间序列,plsql,time-series,Plsql,Time Series,我试图为PL/SQL中的特定时间序列分析提供一个解决方案。我将使用一个非常简单的数据集来解释这个场景。 在COMP_TEST表中,只要事件开始日期和事件结束日期之间有单独的日历日(校准日期),事件就会为其创建一行。在事件编号1772349的情况下,我们得到2020年1月10日至2020年24月10日的行,因为这是开始和结束范围。 在每个给定的日历日,某些事件的结果在事件结果列中记录为“是”或“否” 检查要求: 每7个日历日应有一个“是”事件结果 两个“是”之间的间隔不应超过7个日历日 结果 将

我试图为PL/SQL中的特定时间序列分析提供一个解决方案。我将使用一个非常简单的数据集来解释这个场景。 在COMP_TEST表中,只要事件开始日期和事件结束日期之间有单独的日历日(校准日期),事件就会为其创建一行。在事件编号1772349的情况下,我们得到2020年1月10日至2020年24月10日的行,因为这是开始和结束范围。 在每个给定的日历日,某些事件的结果在事件结果列中记录为“是”或“否”

检查要求:

  • 每7个日历日应有一个“是”事件结果
  • 两个“是”之间的间隔不应超过7个日历日 结果
  • 将统计连续7个日历日的“否”结果块 作为不合规/缺陷的一个单位
  • 每次遇到“是”结果时,计算的计数 “否”结果的未来7个日历日应重置回1
  • 如果在校准日期遇到等于 事件结束日期,则该日期将被视为 不合规/缺陷也是如此
注:此处的7个日历日应包括开始日期和结束日期

在事件ID 1772349的情况下,第一次校准日期20年10月1日的结果为“是”,因此下一个7个日历日的评估将从20年10月2日(第1天)开始,到20年10月8日(第7天)结束,并记录“是”结果。 第二次评估将从20年10月9日开始,这恰好是一个“是”的结果,因此下一次计数实际上将从20年10月10日开始,结果为“否”,并连续7天持续到20年10月16日。 然后,第三次评估将从20年10月17日开始,之后在20年10月18日只有一个额外的“否”结果,然后20年10月19日至20年10月23日的所有天都是“是”结果。最后,在20年10月24日活动的最后一个日历日,我们遇到了一个“否”,这将被归类为缺陷

我已经在下面介绍了创建表脚本、我尝试的查询以及预期的输出。因为这听起来符合缺口和孤岛问题,所以我开始采用这种方法,但不知道如何解决其余的需求

表创建脚本:

CREATE TABLE COMP_TEST ( 
event_id INT 
,cal_date DATE 
,event_result varchar2(5) 
,event_start_date DATE 
,event_end_date DATE 
)
表格插入:

INSERT ALL 
 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/01/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/02/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/03/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/04/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/05/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/06/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/07/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/08/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/09/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/10/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/11/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/12/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/13/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/14/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/15/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/16/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/17/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/18/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/19/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/20/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/21/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/22/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/23/2020','MM/DD/YYYY'),'yes',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (1772349,TO_DATE('10/24/2020','MM/DD/YYYY'),'no',TO_DATE('10/01/2020','MM/DD/YYYY'),TO_DATE('10/24/2020','MM/DD/YYYY')) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/15/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/16/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/17/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/18/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/19/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/20/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/21/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/22/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/23/2020','MM/DD/YYYY'),'yes',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/24/2020','MM/DD/YYYY'),'yes',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/25/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/26/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/27/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/28/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/29/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/30/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('10/31/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/01/2020','MM/DD/YYYY'),'yes',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/02/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/03/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/04/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/04/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/05/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/06/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/07/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/08/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/09/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/10/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/11/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/12/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/13/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL) 
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/14/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL)
INTO COMP_TEST  (event_id, cal_date, event_result, event_start_date, event_end_date)    VALUES (5499345,TO_DATE('11/15/2020','MM/DD/YYYY'),'no',TO_DATE('10/15/2020','MM/DD/YYYY'),NULL)
SELECT * FROM DUAL
我尝试的查询:

WITH DAILY_RESULT AS ( 
SELECT 
    event_id 
    , cal_date 
    , CASE 
        WHEN event_result = 'yes' THEN 'compliant'  
        WHEN event_result = 'no' THEN 'deficient'  
        END AS status 
FROM COMP_TEST 
), 
 
RANKINGS AS ( 
SELECT 
    event_id 
    , cal_date 
    , status AS status 
    , DENSE_RANK() OVER (PARTITION BY event_id ORDER BY cal_date) - 
    DENSE_RANK() OVER (PARTITION BY event_id, status ORDER BY cal_date) 
        AS sequence_grouping 
FROM DAILY_RESULT 
ORDER BY cal_date ASC 
) 
 
SELECT 
    event_id 
    , MIN(cal_date) AS start_date 
    , MAX(cal_date) AS end_date 
    , MAX(cal_date) - MIN(cal_date) AS duration 
     
FROM RANKINGS 
WHERE status = 'deficient' 
 
GROUP BY  
    event_id 
    , sequence_grouping 

HAVING MAX(cal_date) - MIN(cal_date) >=7     
期望输出:

EVENT_ID - START_DATE - END_DATE
1772349 -- 10/10/2020 -- 10/16/2020
1772349 -- 10/24/2020 -- 10/24/2020
5499345 -- 10/15/2020 -- 10/21/2020
5499345 -- 10/25/2020 -- 10/31/2020
5499345 -- 11/02/2020 -- 11/08/2020
5499345 -- 11/09/2020 -- 11/15/2020

我想这是你想要的,但我没能弄清楚你在
上要求什么。此外,您的问题可能会使用一些格式,因为阅读和理解需求非常困难。感谢您提供
创建表
和DML语句

好的,PL/SQL解决方案,我认为更简单。你可以用一个循环来完成这项工作,但我认为,解释两个循环中发生的事情会让事情变得更清楚。如果你没有大量的数据,那么这可能无关紧要

我们先检查每个事件(外循环),然后检查该事件每天的数据(内循环)。我注意到您在2020年11月4日的
事件id
5499345中放置了两行(不确定这是否是有意的),但内部循环上的
分组方式处理:使用MAX()将首选
'yes'
而不是
'no'
。然后,我们只需在前进过程中计算连续的
'no'
值,以提前范围的结束日期。遇到
'yes'
值会重置计数器,点击7天会打印结果并重置。在给定的
事件id
的数据集末尾,在内环之后,有一个计数器的最后一个测试,用于悬空
'no'

DECLARE
  v_cal_date_ct INTEGER;
  v_start_date  comp_test.cal_date%TYPE;
  v_end_date    comp_test.cal_date%TYPE;
BEGIN
  FOR rec_event IN (SELECT DISTINCT ct.event_id
                      FROM comp_test ct
                     ORDER BY ct.event_id)
  LOOP
    v_cal_date_ct := 0;
  
    FOR rec_date IN (SELECT ct.cal_date,
                            MAX(ct.event_result) AS event_result
                       FROM comp_test ct
                      WHERE ct.event_id = rec_event.event_id
                      GROUP BY ct.cal_date
                      ORDER BY ct.cal_date)
    LOOP
      IF v_cal_date_ct = 0 THEN
        v_start_date := rec_date.cal_date;
        v_end_date   := rec_date.cal_date;
      END IF;
    
      IF rec_date.event_result = 'no' THEN
        v_cal_date_ct := v_cal_date_ct + 1;
        v_end_date    := rec_date.cal_date;
      ELSE
        v_cal_date_ct := 0;
      END IF;
    
      IF v_cal_date_ct >= 7 THEN
        dbms_output.put_line(rec_event.event_id || ' ' ||
                             to_char(v_start_date,
                                     'mm/dd/yyyy') || ' ' ||
                             to_char(v_end_date,
                                     'mm/dd/yyyy'));
        v_cal_date_ct := 0;
      END IF;
    END LOOP;
  
    IF v_cal_date_ct > 0 THEN
      dbms_output.put_line(rec_event.event_id || ' ' ||
                           to_char(v_start_date,
                                   'mm/dd/yyyy') || ' ' ||
                           to_char(v_end_date,
                                   'mm/dd/yyyy'));
    END IF;
  END LOOP;
END;
/
结果:

1772349 10/10/2020 10/16/2020
1772349 10/24/2020 10/24/2020
5499345 10/15/2020 10/21/2020
5499345 10/25/2020 10/31/2020
5499345 11/02/2020 11/08/2020
5499345 11/09/2020 11/15/2020

最后,请记住在SQL*Plus中执行
设置serveroutput ON
,以查看结果。如果您想为自己构建一个表来插入或将其转换为流水线函数,那么同样的逻辑也会起作用。

我认为is做了您想要的事情,但我无法理解您在
上的要求。此外,您的问题可能会使用一些格式,因为阅读和理解需求非常困难。感谢您提供
创建表
和DML语句

好的,PL/SQL解决方案,我认为更简单。你可以用一个循环来完成这项工作,但我认为,解释两个循环中发生的事情会让事情变得更清楚。如果你没有大量的数据,那么这可能无关紧要

我们先检查每个事件(外循环),然后检查该事件每天的数据(内循环)。我注意到您在2020年11月4日的
事件id
5499345中放置了两行(不确定这是否是有意的),但内部循环上的
分组方式处理:使用MAX()将首选
'yes'
而不是
'no'
。然后,我们只需在前进过程中计算连续的
'no'
值,以提前范围的结束日期。遇到
'yes'
值会重置计数器,点击7天会打印结果并重置。在给定的
事件id
的数据集末尾,在内环之后,有一个计数器的最后一个测试,用于悬空
'no'

DECLARE
  v_cal_date_ct INTEGER;
  v_start_date  comp_test.cal_date%TYPE;
  v_end_date    comp_test.cal_date%TYPE;
BEGIN
  FOR rec_event IN (SELECT DISTINCT ct.event_id
                      FROM comp_test ct
                     ORDER BY ct.event_id)
  LOOP
    v_cal_date_ct := 0;
  
    FOR rec_date IN (SELECT ct.cal_date,
                            MAX(ct.event_result) AS event_result
                       FROM comp_test ct
                      WHERE ct.event_id = rec_event.event_id
                      GROUP BY ct.cal_date
                      ORDER BY ct.cal_date)
    LOOP
      IF v_cal_date_ct = 0 THEN
        v_start_date := rec_date.cal_date;
        v_end_date   := rec_date.cal_date;
      END IF;
    
      IF rec_date.event_result = 'no' THEN
        v_cal_date_ct := v_cal_date_ct + 1;
        v_end_date    := rec_date.cal_date;
      ELSE
        v_cal_date_ct := 0;
      END IF;
    
      IF v_cal_date_ct >= 7 THEN
        dbms_output.put_line(rec_event.event_id || ' ' ||
                             to_char(v_start_date,
                                     'mm/dd/yyyy') || ' ' ||
                             to_char(v_end_date,
                                     'mm/dd/yyyy'));
        v_cal_date_ct := 0;
      END IF;
    END LOOP;
  
    IF v_cal_date_ct > 0 THEN
      dbms_output.put_line(rec_event.event_id || ' ' ||
                           to_char(v_start_date,
                                   'mm/dd/yyyy') || ' ' ||
                           to_char(v_end_date,
                                   'mm/dd/yyyy'));
    END IF;
  END LOOP;
END;
/
结果:

1772349 10/10/2020 10/16/2020
1772349 10/24/2020 10/24/2020
5499345 10/15/2020 10/21/2020
5499345 10/25/2020 10/31/2020
5499345 11/02/2020 11/08/2020
5499345 11/09/2020 11/15/2020

最后,请记住在SQL*Plus中执行
设置serveroutput ON
,以查看结果。如果您想自己构建一个表来插入或将其转换为流水线函数,那么同样的逻辑也会起作用。

谢谢@kevin seymour。我会注意格式。缺陷是我稍后将使用它来按事件id汇总计数,这样对我来说添加起来就很简单了。我将在周末检查您的解决方案,然后再与您联系。再次感谢你!我为EVENT_ID 5499345(CAL_日期超过2020年11月1日)插入了一些额外的记录,并且该查询似乎只针对每个EVENT_ID获取两条记录。在某些情况下,一个事件ID可能有几个连续7天的周期需要识别。您能更新y吗