Полагаю, вот как могут выглядеть исходные данные:
message_id status status_date
---------- ------ -----------
1 PC 01-JAN-12
1 QC 02-JAN-12
1 RC 03-JAN-12
2 AA 04-JAN-12
2 PC 05-JAN-12
2 CC 06-JAN-12
3 PC 07-JAN-12
3 PC 08-JAN-12
3 PC 09-JAN-12
И что ожидаемый результат будет примерно таким:
message_id
----------
1
3
Причина, по которой эти две записи возвращаются, заключается в том, что для всех записей, где message_id=1
, запись с минимальным значением status_date
имеет значение 01-JAN-12. Запись с message_id=1
и status_date от 01-JAN-12 имеет статус «ПК», а также с message_id=3
. Поскольку минимум status_date
записей с message_id=2
- 04-JAN-12, а его статус НЕ «ПК».
Мы можем построить этот запрос, используя встроенные представления, но, вероятно, есть более простой способ использования аналитических функций.
SELECT A.MESSAGE_ID
FROM MY_TABLE A,
( SELECT B.MESSAGE_ID, MIN(B.STATUS_DATE) MIN_DATE
FROM MY_TABLE B
GROUP BY B.MESSAGE_ID ) C
WHERE A.STATUS = 'PC'
AND A.STATUS_DATE = C.STATUS_DATE
AND A.MESSAGE_ID = C.MESSAGE_ID;