1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| WITH t AS (SELECT 933986296 AS ID, 0 AS update_id, TRUNC(SYSDATE) AS date_o, 'B' AS type_o FROM dual
UNION ALL
SELECT 933986296 AS ID, 1 AS update_id, TRUNC(SYSDATE) AS date_o, 'B' AS type_o FROM dual
UNION ALL
SELECT 1012731924 AS ID, 0 AS update_id, TRUNC(SYSDATE) AS date_o, 'A' AS type_o FROM dual
UNION ALL
SELECT 1012731924 AS ID, 1 AS update_id, TRUNC(SYSDATE) AS date_o, 'XXX' AS type_o FROM dual
UNION ALL
SELECT 1012731924 AS ID, 2 AS update_id, TRUNC(SYSDATE) AS date_o, 'XXX' AS type_o FROM dual
UNION ALL
SELECT 812732074 AS ID, 11 AS update_id, TRUNC(SYSDATE) AS date_o, 'A' AS type_o FROM dual
UNION ALL
SELECT 812732074 AS ID, 12 AS update_id, TRUNC(SYSDATE) AS date_o, 'B' AS type_o FROM dual
UNION ALL
SELECT 812732074 AS ID, 18 AS update_id, TRUNC(SYSDATE) AS date_o, 'XXX' AS type_o FROM dual)
SELECT ID, update_id, date_o, type_o,
(CASE WHEN last_type > 0
THEN last_type
WHEN MAX(upd_A) OVER (PARTITION BY ID) > NVL(MAX(upd_B) OVER (PARTITION BY ID),-1)
THEN 3
WHEN MAX(upd_B) OVER (PARTITION BY ID) > NVL(MAX(upd_A) OVER (PARTITION BY ID), -1)
THEN 4
ELSE -1 END) TEST
FROM (
SELECT ID, update_id, date_o, type_o,
DECODE(FIRST_VALUE(type_o) OVER (PARTITION BY ID ORDER BY update_id DESC), 'A', 1, 'B', 2, 0) AS last_type,
DECODE(type_o, 'A', update_id) AS upd_A, DECODE(type_o, 'B', update_id) AS upd_B
FROM T
)
ORDER BY 1, 2
ID UPDATE_ID DATE_O TYPE_O TEST
812732074 11 29/04/2008 A 4
812732074 12 29/04/2008 B 4
812732074 18 29/04/2008 XXX 4
933986296 0 29/04/2008 B 2
933986296 1 29/04/2008 B 2
1012731924 0 29/04/2008 A 3
1012731924 1 29/04/2008 XXX 3
1012731924 2 29/04/2008 XXX 3 |