MERGE INTO table_name dst
USING (
SELECT rowid rid, new_dt
FROM table_name
MATCH_RECOGNIZE(
PARTITION BY id
ORDER BY dt DESC, result DESC
MEASURES
FIRST(dt) AS new_dt
ALL ROWS PER MATCH
PATTERN (not_processed* processed )
DEFINE
processed AS result = 'PROCESSED',
not_processed AS result = 'NOT_PROCESSED'
)
WHERE result = 'PROCESSED'
) src
ON (dst.ROWID = src.rid)
WHEN MATCHED THEN
UPDATE
SET new_date = new_dt;
其中,对于示例数据:
CREATE TABLE table_name(id, dt, result, new_date) AS
SELECT 123, DATE '2023-02-26', 'PROCESSED', CAST(NULL AS DATE) FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-05', 'NOT_PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-05', 'PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-05', 'PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-12', 'NOT_PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-13', 'NOT_PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-20', 'PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-21', 'NOT_PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-21', 'PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-21', 'PROCESSED', NULL FROM DUAL UNION ALL
SELECT 123, DATE '2023-03-28', 'PROCESSED', NULL FROM DUAL;
select rn, dt, result, grp,
case
when result = 'P'
and (lead(result) over (partition by id order by rn) = 'P' or
lead(result) over (partition by id order by rn) is null )
then dt
when result = 'P' and lead(result) over (partition by id order by rn) = 'N'
then max(dt) over (partition by id, grp)
end new_dt
from (
select row_number() over (partition by id order by dt, result) rn,
id, dt, result,
count(case result when 'P' then 1 end)
over (partition by id order by dt, result) grp
from t )
order by rn
2条答案
按热度按时间a6b3iqyw1#
在Oracle 12中,可以使用
MATCH_RECOGNIZE
进行逐行处理,并使用MERGE
语句更新表:其中,对于示例数据:
在
MERGE
之后,该表包含:| ID|数据传输|结果|新日期|
| --------------|--------------|--------------|--------------|
| 一百二十三|2023年2月26日00时00分|已处理|2023年3月5日00时00分|
| 一百二十三|2023年3月5日00时00分|未处理|* 无效 |
| 一百二十三|2023年3月5日00时00分|已处理|2023年3月5日00时00分|
| 一百二十三|2023年3月5日00时00分|已处理|2023年3月13日00时00分|
| 一百二十三|2023年3月12日00时00分|未处理| 无效 |
| 一百二十三|2023年3月13日00时00分|未处理| 无效 |
| 一百二十三|2023年3月20日00时00分|已处理|2023年3月21日00时00分|
| 一百二十三|2023年3月21日00时00分|未处理| 无效 *|
| 一百二十三|2023年3月21日00时00分|已处理|2023年3月21日00时00分|
| 一百二十三|2023年3月21日00时00分|已处理|2023年3月21日00时00分|
| 一百二十三|2023年3月28日00时00分|已处理|2023年3月28日00时00分|
fiddle
kpbwa7wx2#
解析函数和
case ... when
的组合给出了正确的输出:**一个