2016-11-30 7 views
0

У меня проблема, так что моя таблица выглядит ниже;SQL Rank selection oracle

REC_ID | Year | status | -------|-----------|----------| 123 | 2016 | OA | 123 | 2017 | CC |

Мой запрос должен проверить, если для rec_id? если

  1. Существует запись за 2016 год, когда статус ОА затем выбирается в этой строке.
  2. Существует запись за 2016 год, когда статус - это любой статус (а не OA), и нет записи для 2017 года, а затем выберите эту строку (строка 2016).
  3. Существует запись в 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 ; 
+0

Правила кажутся недостаточными. Что делать, если на 2016 год есть только строки, нет строки для 2017 года, ни одна строка не имеет статуса OA, но есть более одной строки? Например, 2016 CC и 2016 AD. Какой из этих строк следует выбрать? Кроме того, если ни одна строка с 2016 и OA, а более одной строки с 2017 - WHICH строка с 2017 должна быть выбрана? – mathguy

ответ

0

Re-редакция рейтинга:

  1. 2016 И статус = 'OA'

Запрос с ROW_NUMBER в выбрать лучший матч за rec_id:

select rec_id, year, status 
from 
(
    select 
    rec_id, year, status, 
    row_number() OVER (partition by rec_id 
       order by case 
       when year = 2016 and status = 'OA' then 1 
       when year = 2017 then 2 
       else 3 
       end) as rn 
    from mytable 
    where year in (2016, 2017) 
) 
where rn = 1; 
+0

спасибо, что это работает – Mohamed

0

Это приоритезация запрос, который предлагает использовать row_number(). Я думаю, что вы хотите:

select t.* 
from (select t.*, 
      row_number() over (partition by rec_id 
           order by (case when year = 2016 and status = 'OA' then 1 else 2 end), 
             year desc 
           ) as seqnum 
     from table t 
     where year in (2016, 2017) 
    ) t 
where seqnum = 1; 
+0

спасибо, что это работает – Mohamed