Oracle:从其他表的联接结果向表中插入记录,避免重复记录

时间:2019-03-20 11:18:56

标签: sql oracle plsql

我是Oracle SQL和PL / SQL的新手。 我受命从3个表中获取记录。 mccm_ops_monitoring_1_day,其中包含当天的数据; mccm_ops_monitoring_7_days,其中包含最近7天的数据。基于这些表的连接以及静态表alarm_control_table,我需要找到当前天和最近7天的平均值之间的差异。结果应在15分钟的mccm_ops_monitoring_1_day中分组。间隔。我创建了查询并获得了预期的结果。 麻烦的是,我必须将这些结果放在另一个表中,该表通过运行查询每15分钟更新一次。我尝试使用一个过程来完成它,并安排了一个作业,但这导致记录重复工作运行的次数。因此,我不得不放弃该程序。我尝试使用物化视图,但它本身并没有刷新。

查询如下。请帮助我找到解决方案。

SELECT
    to_timestamp((TO_CHAR(SYSDATE,'DD-MON-RR')|| ' '|| TO_CHAR(m.contact_date,'HH:MI:SS AM')), 'DD-MON-RR HH:MI:SS AM') AS contact_date,
    m.interactivechannelname,
    m.interactionpointname,
    nvl(m.channel_type,'UNKNOWN')channel_type,
    m.cbu,
    m.segment,
    m.visits todays_visits,
    nvl(w.visits,0) last_7_days_visits,
    m.visits - nvl(w.visits,0) today_vs_7days_visits_diff,
    m.accepts todays_accepts,
    nvl(w.accepts,0) last_7_days_accepts,
    m.accepts - nvl(w.accepts,0) today_vs_7days_accepts,
    CASE
            WHEN ( m.visits - w.visits ) / 100 > c.visit_threshold OR ( w.visits - m.visits ) / 100 > c.visit_threshold THEN 'YES'
            WHEN ( m.accepts - w.accepts ) / 100 > c.accept_threshold OR ( w.accepts - m.accepts ) / 100 > c.accept_threshold THEN 'YES'
        END
    AS alert_msg,
    CASE
            WHEN ( m.visits - w.visits ) / 100 > c.visit_threshold OR ( w.visits - m.visits ) / 100 > c.visit_threshold THEN c.alarm_text
            WHEN ( m.accepts - w.accepts ) / 100 > c.accept_threshold OR ( w.accepts - m.accepts ) / 100 > c.accept_threshold THEN c.alarm_text
        END
    AS alarm_text
FROM
    mccm_ops_monitoring_1_days m
    LEFT JOIN mccm_ops_monitoring_7_days w ON TO_CHAR(m.contact_date,'HH24:MI:SS AM') = TO_CHAR(w.contact_date,'HH24:MI:SS AM')
                                              AND m.interactivechannelname = w.interactivechannelname
                                              AND m.interactionpointname = w.interactionpointname
                                              AND nvl(m.channel_type,'UNKNOWN') = nvl(w.channel_type,'UNKNOWN')
                                              AND m.cbu = w.cbu
                                              AND m.segment = w.segment
    LEFT JOIN alarm_control_table c ON m.interactivechannelname = c.interactivechannelname
                                 AND m.interactionpointname = c.interactionpointname
                                 AND nvl(m.channel_type,'UNKNOWN') = nvl(c.channel_type,'UNKNOWN')
                                 AND m.cbu = c.cbu
                                 AND m.segment = c.segment;

1 个答案:

答案 0 :(得分:0)

如果要求允许,您可以截断并加载过程中的数据。它应该解决重复的问题。