oracle 获取处理结果的日期

e37o9pze  于 2023-03-29  发布在  Oracle
关注(0)|答案(2)|浏览(216)

我有下面的表格。

在上表中,我需要根据“注解”、“日期”、“结果”列填充“新日期”。我只需要为“已处理结果”列填充日期。
所以在上表中..突出显示的颜色注解列应该与突出显示的新日期列相匹配。日期和新日期列是相同的..只是用相同的颜色突出显示。
如果当前记录已处理而下一个记录未处理,则需要在已处理记录开始之前找到最后一个not_processed记录的日期。如果下一个记录已处理,则当前记录日期应为new_date。
提前感谢!!
我尝试使用排名,铅功能,但不能得到任何逻辑正确

a6b3iqyw

a6b3iqyw1#

在Oracle 12中,可以使用MATCH_RECOGNIZE进行逐行处理,并使用MERGE语句更新表:

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;

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

kpbwa7wx

kpbwa7wx2#

解析函数和case ... when的组合给出了正确的输出:

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

**一个

相关问题