oracle 有一张表t,有6个字段,a1,a2,a3联合确定一条数据,b1是字符串,b2是
oracle有一张表t,有6个字段,a1,a2,a3联合确定一条数据,b1是字符串,b2是数字,c是日期,每一段时间从同一个地方抽取数据到t表,把当天的日期以类似2017...
oracle
有一张表t,有6个字段,a1,a2,a3联合确定一条数据,b1是字符串,b2是数字,c是日期,每一段时间从同一个地方抽取数据到t表,把当天的日期以类似20170413的格式存在c字段,表t已经有几次抽到的数据,每次抽到的数据可能和上次的有差异,我要写的SQL就是找出每次和上次之间的差异,a3可能多了或少了,多了错误信息就填a3多了,少了就填a3少了,b1可能和上次不同,错误信息就填b1改变了,b2可能和上次大小不同,错误信息就填b2大小不同,最后查询到的结果是a1,a2,a3,e(错误信息),c,old(有差异的上次的数据),new(有差异的这次数据),大概就是这样,感觉无从下手啊,大神帮帮忙 展开
有一张表t,有6个字段,a1,a2,a3联合确定一条数据,b1是字符串,b2是数字,c是日期,每一段时间从同一个地方抽取数据到t表,把当天的日期以类似20170413的格式存在c字段,表t已经有几次抽到的数据,每次抽到的数据可能和上次的有差异,我要写的SQL就是找出每次和上次之间的差异,a3可能多了或少了,多了错误信息就填a3多了,少了就填a3少了,b1可能和上次不同,错误信息就填b1改变了,b2可能和上次大小不同,错误信息就填b2大小不同,最后查询到的结果是a1,a2,a3,e(错误信息),c,old(有差异的上次的数据),new(有差异的这次数据),大概就是这样,感觉无从下手啊,大神帮帮忙 展开
1个回答
展开全部
1。,用日期分组,比如20170413 有10条数据,20170414 有20条数据。分成2个组。
2。 同样一张表,做两个视图,第一视图v1,分组1,2,3顺序,第二视图v2,分组1,2,3顺序,因为要把v1(旧数据)与v2(新数据)比较。所以v1.rowid+1 =v2.rowid。
3。因为新视图有多有少,那么就要一张总视图v3,包含a3,否则只能知道少了,不知道多了。
4. 做出来的试图是 v3.总a3,v1.a3, v2.a3,以及其他。
5。添加一些字段 b1change,判断,v1.b1 与 v2.b1 是否差异
添加一些字段 b2change,判断,v1.b2 与 v2.b2 是否差异
g1 = select rownum+1 rn ,t1.c from (select c from t group by c) t1 给日期分组,并编组号
g2 = select rownum rn, t1.c from (select c from t group by c) t2
v1 = select g1.rn, t.* from g1,t where g1.c=t.c 原始数据,带上组号。
v2 = select g2.rn, t.* from g2,t where g2.c=t.c
d3= (
select rn,c,a1,a2,a3 from v1
union
select rn,c,a1,a2,a3 from v2
)
d3,v1,v2合并,并取名
v3= select d3.rn,d3.c,d3.a1,d3.a2,d3.a3 , v1.rn v1rn,v1.c v1c,v1.a1 v1a1,v1.a2 v1a2,v1.a3 v1a3, v2.rn v2rn,v2.c v2c,v2.a1 v2a1,v2.a2 v2a2,v2.a3 v2a3
where
v3.rn =v1.rn(+)
and v3.c =v1.c(+)
and v3.a1 =v1.a1(+)
and v3.a2 =v1.a2(+)
and v3.a3 =v1.a3(+)
and v3.c =v2.c(+)
and v3.a1 =v2.a1(+)
and v3.a2 =v2.a2(+)
and v3.a3 =v2.a3(+)
然后,再从v3中判断有无,错误
v4 = select v3.*,
case when v3.v1a3 is null then '新a3多了'
case when v3.v2a3 is null then '新a3少了'
else '' end as a3change,
decode(v3.v1b1,v3.v2b1,'b1变了','') as b1change
decode(v3.v1b2,v3.v2b2,'b2变了','') as b2change
from v3
再把上边上面的sql 组合成一个sql语句,就行了。
2。 同样一张表,做两个视图,第一视图v1,分组1,2,3顺序,第二视图v2,分组1,2,3顺序,因为要把v1(旧数据)与v2(新数据)比较。所以v1.rowid+1 =v2.rowid。
3。因为新视图有多有少,那么就要一张总视图v3,包含a3,否则只能知道少了,不知道多了。
4. 做出来的试图是 v3.总a3,v1.a3, v2.a3,以及其他。
5。添加一些字段 b1change,判断,v1.b1 与 v2.b1 是否差异
添加一些字段 b2change,判断,v1.b2 与 v2.b2 是否差异
g1 = select rownum+1 rn ,t1.c from (select c from t group by c) t1 给日期分组,并编组号
g2 = select rownum rn, t1.c from (select c from t group by c) t2
v1 = select g1.rn, t.* from g1,t where g1.c=t.c 原始数据,带上组号。
v2 = select g2.rn, t.* from g2,t where g2.c=t.c
d3= (
select rn,c,a1,a2,a3 from v1
union
select rn,c,a1,a2,a3 from v2
)
d3,v1,v2合并,并取名
v3= select d3.rn,d3.c,d3.a1,d3.a2,d3.a3 , v1.rn v1rn,v1.c v1c,v1.a1 v1a1,v1.a2 v1a2,v1.a3 v1a3, v2.rn v2rn,v2.c v2c,v2.a1 v2a1,v2.a2 v2a2,v2.a3 v2a3
where
v3.rn =v1.rn(+)
and v3.c =v1.c(+)
and v3.a1 =v1.a1(+)
and v3.a2 =v1.a2(+)
and v3.a3 =v1.a3(+)
and v3.c =v2.c(+)
and v3.a1 =v2.a1(+)
and v3.a2 =v2.a2(+)
and v3.a3 =v2.a3(+)
然后,再从v3中判断有无,错误
v4 = select v3.*,
case when v3.v1a3 is null then '新a3多了'
case when v3.v2a3 is null then '新a3少了'
else '' end as a3change,
decode(v3.v1b1,v3.v2b1,'b1变了','') as b1change
decode(v3.v1b2,v3.v2b2,'b2变了','') as b2change
from v3
再把上边上面的sql 组合成一个sql语句,就行了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询