SQL для пометки ошибок и получения последнего действительного статуса

Пожалуйста, помогите с приведенным ниже сценарием, у меня есть набор записей, которые мне нужно зациклить для данного идентификатора и Case_Type и пометить запись как Действительный или ОШИБКА.

Так как это таблица аудита, события должны быть в порядке, например, open/pend/done или open/done

Таким образом, Rec_no 1 и 4 являются ОШИБКАМИ в приведенных ниже примерах данных. Rec_no 5 (для идентификатора 9) содержит статус "Последний действительный" ("готово").

Ниже приведен пример записи:

Rec_num  ID  Case_Type  Status
1      9      1      Pend     -- ERROR (Out of Order)
2        9       1       open
3        8       1       open
4        9       1       open       -- ERROR (Duplicate)
5        9       1       done       
6        9       1       open
7        8       1       done

Мне нужен следующий вывод:

Lag and Lead functions are not available in DB2 z/OS.

This is what i have till now. I guess I need something like 

max(case when previous_stat = 'open' and (Status = 'Pend' or Status = 'done' then 1 else 0) as Flag over(partition by ID,Case_Type order by Rec_num).


WITH     TST AS                                                                                                                                         
(SELECT 1 AS Rec_Num, 9 AS ID, 1 AS Case_Type, 'Pend'  AS Status FROM               
SYSIBM.SYSDUMMY1 UNION ALL 
SELECT 2 AS Rec_Num, 9 AS ID, 1 AS Case_Type, 'open'  AS Status FROM               
SYSIBM.SYSDUMMY1 UNION ALL                                                     
SELECT 3 AS Rec_Num , 8 AS ID,2  AS Case_Type, 'open'  AS Status FROM                
SYSIBM.SYSDUMMY1  UNION ALL                                                    
SELECT 4 AS Rec_Num, 9 AS ID, 1 AS Case_Type, 'open' AS Status FROM SYSIBM.SYSDUMMY1
UNION ALL                                                                      
SELECT 5 AS Rec_Num, 9 AS ID, 1 AS Case_Type, 'done' AS Status FROM SYSIBM.SYSDUMMY1
UNION ALL                                                                      
SELECT 6 AS Rec_Num, 9 AS ID, 1 AS Case_Type, 'open'  AS Status FROM                 
SYSIBM.SYSDUMMY1
union all
SELECT 7 AS Rec_Num, 8 AS ID, 1 AS Case_Type,  'done' AS Status FROM                 
SYSIBM.SYSDUMMY1)                                                              
                                                                               
SELECT ID,Case_Type, Status, MAX(Status) OVER(PARTITION BY ID,Case_Type ORDER BY    
Rec_Num ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS PREVIOUS_STAT      from TST
Rec_num  ID  Case_Type  Status    Flag
1      9      1      Pend      ERROR
2        9       1       open      Valid
3        8       1       open      Valid
4        9       1       open      ERROR
5        9       1       done      Valid 
6        9       1       open      ERROR
7        8       1       done      Valid

0 ответов

Другие вопросы по тегам