2015-03-24 95 views
0

我正在嘗試使用case語句創建2個標誌。Oracle多個案例陳述

Flag1 = event_per_month 
Flag2 = event_per_day 

下面是樣本數據

我期待以每天和每月的ID發生創建兩個標誌。

EVENT_PER_DAY邏輯:如果給定的id和msg不止一次在同一天重複,那麼event_per_day標誌將變爲重複事件(id和msg的組合)的「T」,否則它將保持「T」。

EVENT_PER_MONTH邏輯:如果給定的id和msg在同一個月中重複多次,那麼event_per_month標誌將變爲重複事件(id和msg的組合)的「T」,否則它將保持「T」。

我使用了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」?請更清楚地解釋邏輯。什麼是「獨特」? – 2015-03-24 23:13:26

+0

@GordonLinoff:用邏輯信息更新了問題。 EVENT_PER_DAY邏輯:如果一個給定的id和msg不止一次在同一天重複,那麼event_per_day標誌將變爲重複事件的「T」(id和msg的組合),否則它將保持「T」。 EVENT_PER_MONTH邏輯:如果給定的id和msg在同一個月內重複多次,那麼event_per_month標誌將變爲重複事件(id和msg的組合)的「T」,否則它將保持「T」。 – 2015-03-24 23:17:30

回答

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; 

編輯:

上面的查詢應該罰款,但也許使用子查詢幫助:

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

它拋出無效的關係運算符錯誤。對於查詢 – 2015-03-24 23:47:43

+0

@DataAnalyst中的= 1選擇。 。 。這個錯誤並不合理,但是子查詢可能會修復它。 – 2015-03-24 23:55:54

+0

它工作。謝謝Gordon Linoff! – 2015-03-27 05:37:53