Сравните и получите новые данные, вставленные в таблицу на основе месяца и определенного порога - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть FM_TBL таблица с столбцом month_id, который является числовым типом данных, и даты сохраняются в этом формате в формате «ГГГГММ».

Я хочу сравнить данные за предыдущий месяц и текущий месяц, и на основе этого узнать количество новых строк, вставленных в FM_TABLE в текущем месяце.

И я хочу видеть только количество строк, для которых разница не между -10 и 10.

Например, если я использую: ROUND (100 * ( (num_rows - num_rows_prev) / num_rows), 2) diff_pct

и в WHERE состоянии, если можно поставить diff_pct not between -10 and 10

тогда я могу получить только количество строк, которые были вставлены в текущем месяце, и количество строк не в диапазоне от -10 до 10.

Полезная ссылка: Сравнить и получить новые данные, вставленные в таблицу на основе месяца

[! [Введите описание изображения здесь] [1]] [1]

У меня есть запрос ниже, который сравнивает количество строк за предыдущий месяц и текущий месяц и возвращает результат, если в таблицу FM_TBL добавляется новое количество строк, а пороговое значение для нового количества строк не находится между процентами - 10 и 2. [! [введите описание изображения здесь] [2]] [2]

Теперь я хочу создать новый запрос для таблицы FM_TBL, который должен дать мне то количество строк DIFF из результата, который я вижу из запроса выше.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я думаю, вы могли бы использовать это:

select * 
  from (
    select fm.*, 
           count(1) over (partition by cust_srcid) cid, 
           count(case when month_id = m1 then 1 end) over () c1,
           count(case when month_id = m2 then 1 end) over () c2
      from fm_tbl fm 
      join (select 201806 m1, 201805 m2 from dual) m on month_id in (m1, m2))
  where cid < 2 and abs((c1-c2)/c2) > .1

рабочая демонстрация, построенная на ваших данных выборки

Как это работает?

  • в столбце CID мы подсчитываем, сколько раз одинаковое ID появляется в сравнении месяцев
  • C1 считает строки за первый месяц, C2 за второй,
  • подзапрос m - это место, где я сравнивал месяцы. Вы можете использовать sysdate, чтобы сделать его универсальным, я сделал это для целей тестирования,
  • final where фильтрует только строки, которые были в одном месяце (текущем или предыдущем), но не в обоих; также мы показываем результат только тогда, когда количество строк (c1 и c2) для каждого месяца отличается более чем на 10%.

Я использовал count только в аналитической версии, пожалуйста, прочитайте документацию и примеры, если вы этого не знаете. И если вы хотите, чтобы подзапрос, основанный на sysdate, изменился на:

select to_char(sysdate, 'YYYYMM') as m1, 
       to_char(add_months(sysdate, -1), 'YYYYMM') as m2 
  from dual
0 голосов
/ 06 сентября 2018

должен быть выбран для строк, где существует условие не в абс (10%)

select * from  my_table  m
inner join  (
    select SYS_DB_NAME, ENTITY_ID, MONTH_ID
    from my_table 
    where MONTH_ID =  to_char(sysdate, 'YYYY') || lpad( extract(month from sysdate), 2,'0')
    minus  
    select  SYS_DB_NAME, ENTITY_ID, MONTH_ID
    from my_table 
    where MONTH_ID =  to_char(sysdate, 'YYYY') || lpad(( extract(month from sysdate) -1) , 2,'0') 
) T on m.SYS_DB_NAME = t.SYS_DB_NAME 
      AND m.ENTITY_ID = t.ENTITY_ID 
        AND m.MONTH_ID = t.MONTH_ID 
where exists (
   select t1.tot_act_month
         , t2.tot_prev_month
        , abs(100*((t1.tot_act_month -t2.tot_prev_month)/t2.tot_prev_month)) rate 
        from  (
        select count(*) tot_act_month
        from my_table 
        where MONTH_ID =  to_char(sysdate, 'YYYY') || lpad( extract(month from sysdate), 2,'0') 
        ) t1 
        cross join  (
        select count(*) tot_prev_month
        from my_table 
        where MONTH_ID =  to_char(sysdate, 'YYYY') || lpad( extract(month from sysdate), 2,'0') 
        ) t2 
        where abs(100*((t1.tot_act_month -t2.tot_prev_month)/t2.tot_prev_month))  <= 10.0 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...