Oracle: вставлять записи в таблицу из результатов объединения других таблиц, избегая дублирования записей - PullRequest
0 голосов
/ 20 марта 2019

Я новичок в Oracle SQL и PL / SQL. Мне было поручено получить записи из 3 таблиц. mccm_ops_monitoring_1_day, который содержит данные текущего дня, mccm_ops_monitoring_7_days, который содержит данные за последние 7 дней. Основываясь на объединениях этих таблиц вместе со статической таблицей alarm_control_table, мне нужно найти разницу между значениями текущего дня и последних 7 дней в среднем. Результат должен быть сгруппирован из mccm_ops_monitoring_1_day через 15 минут. интервалы. Я создал запрос и получил желаемый результат. Проблема в том, что я должен поместить эти результаты в другую таблицу, которая обновляется каждые 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 голосов
/ 20 марта 2019

Если требование позволяет, вы можете обрезать и загрузить данные в вашей процедуре. Это должно решить проблему дубликатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...