场景和步骤 "get last change" 问题

Scenarios andsSteps "get last change" problem

我有以下 table 抽象一些场景及其步骤 START_DATE “desc”。

SCENARIO_KEY STEP_KEY START_DATE END_DATE PREVIOUS_SCENARIO_KEY PREVIOUS_STEP_KEY
128 44 20xx04x4 0 120 44
120 44 20xx03x3 20xx04x4 120 38
120 38 20xx11x0 20xx03x3 121 38
121 38 20xx07x2 20xx11x0 120 44
120 44 20xx07x1 20xx07x2 120 38

我需要在最后一次更改为值 44 (step_key = 44) 后获取第一个 scenario_key(或另一个标识符)。

所以这个查询的结果应该是最后一次更改的一些标识符 - 第一行的 START_DATE 最后一次更改后值为 44 (20xx03x3) 或 SCENARIO_KEY 最后一次更改后 (120) .

简而言之,我需要能够识别最后更改为“44”步键的行。

是否有任何分析函数(或其他查询)可以实现此目的?你能给点建议吗?

嗯。 . .您可以使用以下方法获得最后一个非 44 日期之后最早的 44 日期:

select min(start_date)
from t
where t.start_date > (select max(t2.start_date)
                      from t t2
                      where t2.step_key <> 44
                     );

我想这就是你想要的。

您也可以使用 window 函数。假设最近一行是“44”:

select t.*
from (select t.*,
             row_number() over (order by start_date) as seqnum,
             row_number() over (partition by step_key order by start_date) as seqnum_sk
      from t
     ) t
where step_key = 44 and seqnum = seqnum_sk
order by start_date
fetch first 1 row only;

您可以使用 MATCH_RECOGNIZE 查找具有 STEP_KEY44 的最新一组连续行中最早的行:

SELECT SCENARIO_KEY,
       STEP_KEY,
       START_DATE,
       END_DATE,
       PREVIOUS_SCENARIO_KEY,
       PREVIOUS_STEP_KEY
FROM   table_name
MATCH_RECOGNIZE(
  ORDER BY start_date DESC
  MEASURES
    match_number() AS mno,
    classifier() AS cls
  ALL ROWS PER MATCH
  PATTERN ( sk44_1* sk44_2 )
  DEFINE
    sk44_1 AS step_key = 44,
    sk44_2 AS step_key = 44
)
WHERE  mno = 1
AND    cls = 'SK44_2'

其中,对于示例数据:

CREATE TABLE table_name (
  SCENARIO_KEY,
  STEP_KEY,
  START_DATE,
  END_DATE,
  PREVIOUS_SCENARIO_KEY,
  PREVIOUS_STEP_KEY
) AS
SELECT 128, 44, DATE '2021-04-04', NULL, 120, 44 FROM DUAL UNION ALL
SELECT 120, 44, DATE '2021-03-13', DATE '2021-04-04', 120, 38 FROM DUAL UNION ALL
SELECT 120, 38, DATE '2020-11-10', DATE '2021-03-13', 121, 38 FROM DUAL UNION ALL
SELECT 121, 38, DATE '2020-07-22', DATE '2020-11-10', 120, 44 FROM DUAL UNION ALL
SELECT 120, 44, DATE '2021-07-01', DATE '2020-07-22', 120, 38 FROM DUAL;

输出:

SCENARIO_KEY STEP_KEY START_DATE END_DATE PREVIOUS_SCENARIO_KEY PREVIOUS_STEP_KEY
120 44 13-MAR-21 04-APR-21 120 38

db<>fiddle here