2015-03-24 3 views
0

Я пытаюсь создать 2 флага, используя регистр case.Oracle несколько операторов case

Flag1 = event_per_month 
Flag2 = event_per_day 

Ниже приведены данные выборки

Ищу создать два флага на основе вхождения идентификатора в день и в месяц.

EVENT_PER_DAY логика: если данный идентификатор и msg повторяются в один и тот же день более одного раза, флаг event_per_day становится «T» для события повторения (комбинация id и msg), в противном случае он остается «T».

EVENT_PER_MONTH логика: если данный идентификатор и msg повторяются в одном и том же месяце более одного раза, флаг event_per_month становится «T» для события повторения (комбинация id и msg), в противном случае он остается «T».

Я использовал case case, но проблема здесь в том, что у меня есть дата, а также столбец месяца, что делает ее немного сложной.

Вот ожидаемый результат

id error_date error_month error category event_per_day event_per_month 
123 15-May-15 12:01:01 May-15 msg1 F F 
123 15-May-15 12:20:00 May-15 msg1 T T 
123 17-May-15 22:00:00 May-15 msg2 F F 
124 17-May-15 20:00:00 May-15 msg2 T T 
123 18-May-15 12:00:00 May-15 msg3 F F 
123 19-May-15 19:00:00 May-15 msg3 F F 
123 20-May-15 12:00:00 May-15 msg4 F F 
123 20-May-15 17:00:00 May-15 msg4 T T 
123 22-May-15 12:00:00 May-15 msg4 F F 
123 23-May-15 12:00:00 May-15 msg4 F F 
123 12-Aug-15 18:00:00 Aug-15 msg1 F F 
123 13-Aug-15 12:00:00 Aug-15 msg2 F F 
123 14-Aug-15 12:00:00 Aug-15 msg3 F F 
123 15-Aug-15 12:00:00 Aug-15 msg4 F F 
123 16-Aug-15 12:00:00 Aug-15 msg1 F T 
123 17-Aug-15 12:00:00 Aug-15 msg1 F T 
123 18-Aug-15 12:00:00 Aug-15 msg2 F T 
123 19-Aug-15 12:00:00 Aug-15 msg3 F T 
123 20-Aug-15 12:00:00 Aug-15 msg4 F T 
123 21-Aug-15 12:00:00 Aug-15 msg3 F T 
890 15-May-15 12:01:01 May-15 msg1 F F 
890 15-May-15 12:20:00 May-15 msg1 T T 
890 17-May-15 22:00:00 May-15 msg2 F F 
890 17-May-15 20:00:00 May-15 msg2 T T 
890 18-May-15 12:00:00 May-15 msg3 F F 
890 19-May-15 19:00:00 May-15 msg3 F F 
890 20-May-15 12:00:00 May-15 msg4 F F 
890 20-May-15 17:00:00 May-15 msg4 T T 
890 22-May-15 12:00:00 May-15 msg4 F F 
890 23-May-15 12:00:00 May-15 msg4 F F 
890 12-Aug-15 18:00:00 Aug-15 msg1 F F 
890 13-Aug-15 12:00:00 Aug-15 msg2 F F 
890 14-Aug-15 12:00:00 Aug-15 msg3 F F 
890 15-Aug-15 12:00:00 Aug-15 msg4 F F 
890 16-Aug-15 12:00:00 Aug-15 msg1 F T 
890 17-Aug-15 12:00:00 Aug-15 msg1 F T 
890 18-Aug-15 12:00:00 Aug-15 msg2 F T 
890 19-Aug-15 12:00:00 Aug-15 msg3 F T 
890 20-Aug-15 12:00:00 Aug-15 msg4 F T 
890 21-Aug-15 12:00:00 Aug-15 msg3 F T 
+0

Результаты в вашей таблице не имеют смысла для меня. Почему первые две строки имеют «F» и «T»? Пожалуйста, объясните логику более четко. Что такое «уникальное»? –

+0

@GordonLinoff: Обновлен вопрос с логической информацией. Логика EVENT_PER_DAY: если данный идентификатор и msg повторяются в один и тот же день более одного раза, флаг event_per_day становится «T» для события повторения (комбинация id и msg), иначе он остается «T». Логика EVENT_PER_MONTH: если данный идентификатор и msg повторяются в одном и том же месяце более одного раза, флаг event_per_month становится «T» для события повторения (комбинация id и msg), в противном случае он остается «T». –

ответ

0

Я думаю, что вы хотите, аналитические функции:

select t.*, 
     (case when row_number() over (partition by trunc(error_date), msg 
            order by error_date 
            ) = 1 
      then 'F' else 'T' 
     end) as event_per_day, 
     (case when row_number() over (partition by error_month, msg 
            order by error_date 
            ) = 1 
      then 'F' else 'T' 
     end) as event_per_month 
from table t; 

EDIT:

выше запрос должен быть хорошо, но, возможно, с использованием подзапроса поможет :

select t.*, 
     (case when seqnum_day = 1 then 'F' else 'T' end) as event_per_day, 
     (case when seqnum_mon = 1 then 'F' else 'T' end) as event_per_month 
from (select t.*, 
      row_number() over (partition by trunc(error_date), msg 
           order by error_date) as seqnum_day, 
      row_number() over (partition by error_month, msg 
           order by error_date) as seqnum_mon 
     from table t 
    ) t; 
+0

Выбрасывает неверную ошибку оператора связи. для выбора = 1 в запросе –

+0

@DataAnalyst. , , Эта ошибка не имеет смысла, но, возможно, подзапрос ее исправит. –

+0

Это сработало. Спасибо, Гордон Линофф! –

Смежные вопросы