【问题标题】:Oracle multiple case statementsOracle 多案例陈述
【发布时间】:2015-03-24 23:09:45
【问题描述】:

我正在尝试使用 case 语句创建 2 个标志。

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

【问题讨论】:

  • 你表中的结果对我来说没有意义。为什么前两行有“F”和“T”?请更清楚地解释逻辑。什么是“独特”?
  • @GordonLinoff:用逻辑信息更新了问题。 EVENT_PER_DAY 逻辑:如果给定的 id 和 msg 在同一天重复多次,则 event_per_day 标志对于重复事件(id 和 msg 的组合)变为“T”,否则保持“T”。 EVENT_PER_MONTH 逻辑:如果给定的 id 和 msg 在同一个月内重复多次,则 event_per_month 标志对于重复事件(id 和 msg 的组合)变为“T”,否则保持“T”。

标签: sql database oracle11g oracle-sqldeveloper


【解决方案1】:

我想你想要分析函数:

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;

【讨论】:

  • 它抛出无效的关系运算符错误。对于查询中的 =1 选择
  • @DataAnalyst 。 . .该错误实际上没有意义,但也许子查询会修复它。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2017-08-30
  • 1970-01-01
  • 2023-04-10
  • 2010-10-30
  • 2016-02-21
相关资源
最近更新 更多