SELECT * FROM ( select data.dataid, data.name, DATA.NEW_DT, DATA.NEW_SUB_DT, MAX(OLD_DT) OLD_DT, MAX(OLD_SUB_DT) OLD_SUB_DT from ( select doc.dataid, doc.name, REGEXP_REPLACE(doc.NAME, ' *[\].*$','') NEW_DT, REGEXP_REPLACE(REGEXP_REPLACE(doc.NAME, '^[^\]*[\] *',''), ' *[\].*$', '') NEW_SUB_DT, decode(la.attrid, 15, la.valstr, null) OLD_DT, decode(la.attrid, 16, la.valstr, null) OLD_SUB_DT from dtree doc join dtreeancestors da on doc.dataid = da.dataid and da.ancestorid = 304086 and doc.subtype = 144 join llattrdata la on la.defid = 45942 and la.attrid in (15,16) and la.id = doc.dataid and la.vernum = doc.versionnum ) data group by data.dataid, data.name, DATA.NEW_DT, DATA.NEW_SUB_DT ) DATA WHERE DATA.NEW_DT <> DATA.OLD_DT OR DATA.NEW_SUB_DT <> DATA.OLD_SUB_DT OR DATA.OLD_DT IS NULL OR DATA.OLD_SUB_DT IS NULL ;