У меня такая проблема, что моя таблица выглядит так:
REC_ID | Year | status |
-------|-----------|----------|
123 | 2016 | OA |
123 | 2017 | CC |
Мой запрос должен проверить, соответствует ли rec_id ? если
- Существует запись за 2016 год, в которой статус OA, затем выберите эту строку.
- Существует запись за 2016 год, где статус – любой другой статус (не OA), а записи за 2017 год не существует, а затем выберите эту строку (строка 2016 года).
- Существует запись за 2016 год с любым другим статусом (не OA), и запись существует за 2017 год, затем выберите запись за 2017 год.
поэтому в приведенном выше примере должна быть выбрана запись 2016 года.
REC_ID | Year | status |
-------|-----------|----------|
456 | 2016 | OP |
в этом примере, поскольку есть только одна запись, должна быть выбрана запись 2016 года.
REC_ID | Year | status |
-------|-----------|----------|
789 | 2016 | OM |
789 | 2017 | CC |
В этом последнем примере, поскольку есть две записи, и 2016 НЕ является OA, запись 2017 должна быть выбрана.
Я попытался ранжировать их, но это не сработало, и попытался сделать что-то вроде ниже, но обе записи были подобраны.
SELECT CASE
WHEN (STATUS = 'OA'
AND YEAR = TO_CHAR(SYSDATE, 'YYYY')
AND ?= REC_ID)
OR ((SELECT COUNT(*)
FROM TABLE
WHERE ?= REC_ID
AND YEAR = TO_CHAR(add_months(sysdate, 12), 'YYYY' ))= 0)
THEN TABLE.STATUS
ELSE
(SELECT STATUS
FROM TABLE
WHERE ?= REC_ID
AND YEAR = TO_CHAR(add_months(sysdate, 12), 'YYYY' )
)
END from TABLE WHERE ?= REC_ID ;