У меня проблема, так что моя таблица выглядит ниже;SQL Rank selection oracle
REC_ID | Year | status | -------|-----------|----------| 123 | 2016 | OA | 123 | 2017 | CC |
Мой запрос должен проверить, если для rec_id? если
- Существует запись за 2016 год, когда статус ОА затем выбирается в этой строке.
- Существует запись за 2016 год, когда статус - это любой статус (а не OA), и нет записи для 2017 года, а затем выберите эту строку (строка 2016).
- Существует запись в 2016 году с любой-другой статус (не ОА) и существует запись для 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 ;
Правила кажутся недостаточными. Что делать, если на 2016 год есть только строки, нет строки для 2017 года, ни одна строка не имеет статуса OA, но есть более одной строки? Например, 2016 CC и 2016 AD. Какой из этих строк следует выбрать? Кроме того, если ни одна строка с 2016 и OA, а более одной строки с 2017 - WHICH строка с 2017 должна быть выбрана? – mathguy