我有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行数。
答案 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
使其通用,我是出于测试目的而这么做的,where
仅过滤一个月(当前或以前)中的行,而不是两个月中的行;同样,我们仅在每个月的行数(c1
和c2
)相差超过10%时显示结果。我仅在分析版本中使用过count
,如果您不知道,请阅读文档和示例。并且如果您要基于sysdate的子查询更改为:
select to_char(sysdate, 'YYYYMM') as m1,
to_char(add_months(sysdate, -1), 'YYYYMM') as m2
from dual