场景和步骤 "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_KEY
值 44
的最新一组连续行中最早的行:
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
我有以下 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_KEY
值 44
的最新一组连续行中最早的行:
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