根据定义的月份和阈值比较并获取插入表中的新数据

时间:2018-09-06 09:05:14

标签: sql oracle

我有FM_TBL表,该表的month_id列是数字数据类型,日期以'YYYYMM'格式存储。

我想比较上个月和当月的数据,并以此为基础找出当月插入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之间的行数。

有用的链接:Compare and get the new data inserted into table based on month

[![在此处输入图片描述] [1]] [1]

我在下面的查询中比较上个月和当月的行数,如果FM_TBL表中添加了新的行数,并且新行数的阈值不在百分比之间,则返回结果- 10和2。 [![在此处输入图片描述] [2]] [2]

现在,我想为FM_TBL表创建新查询,该查询应为我提供从查询中可以看到的结果中的DIFF行数。

2 个答案:

答案 0 :(得分:2)

应该选择不存在abs(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 
)

答案 1 :(得分:0)

我认为您可以使用此

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

working demo built on your sample data

它如何工作?

  • CID列中,我们计算了在比较月份中同一ID出现了多少次,
  • C1对第一个月进行计数,C2对第二个月进行计数,
  • 子查询m是我放置几个月的地方。您可以使用sysdate使其通用,我是出于测试目的而这么做的,
  • final where仅过滤一个月(当前或以前)中的行,而不是两个月中的行;同样,我们仅在每个月的行数(c1c2)相差超过10%时显示结果。

我仅在分析版本中使用过count,如果您不知道,请阅读文档和示例。并且如果您要基于sysdate的子查询更改为:

select to_char(sysdate, 'YYYYMM') as m1, 
       to_char(add_months(sysdate, -1), 'YYYYMM') as m2 
  from dual