概述
现在遇到这么一个情况
软件sql server2000老系统人员职称表动表,是只记录变动年度,两年度之间的保持更改前的年度的状态如
人员编号
年度
状态
580101002
2001
1
580101002
2008
2
580101002
2010
4
580101003
2003
1
580101003
2004
3
580101003
2008
4
分析 :580101002这个人从2001进入本单位系统,开始状态为1,在后来的几年里状态一直没有改变,直到2008年升级为2,那么2001至2007状态就是1,到2010年他又发生改变为4;而580101003这个人是2003年加入本单位系统,到2004年、2008年发生过两次变动,虽然没有2010年,那么2010年应该他应该也是保持2008年的状态。但到了新系统ORACLE数据库设计也不知道出于什么考虑制造很多冗余数据为每年每人一个状态记录即使没有改变如下表icme_student_rank_tran_log
Ic_code(人员编号)
Year_name(年度)
is_valid(状态)
580101002
2001
1
580101002
2002
1
580101002
2003
1
580101002
2004
1
580101002
2005
1
580101002
2006
1
580101002
2007
1
580101002
2008
2
580101002
2009
2
580101002
2010
4
580101003
2003
1
580101003
2004
3
580101003
2005
3
580101003
2006
3
580101003
2007
3
580101003
2008
4
580101003
2009
4
580101003
2010
4
那么现在的问题是
如果用户反应,新系统里的状态和老系统不一致了,那么怎么比对呢?
我的方法:
因生产库中年度在oracle又关联了其它表以上没有举例,但是思路不影响。
WITH c AS
(SELECT 人员编号 icnum, 年度 minyear,
NVL (LEAD (年度) OVER (PARTITION BY 人员编号 ORDER BY 人员编号,
年度),
2010
) maxyear,
人员状态
FROM 人员变动表@icme2
ORDER BY 1, 2),
c1 AS
(SELECT slog.is_valid, ic_code, year_name
FROM icme_student_rank_tran_log slog JOIN icme_year iy
ON slog.year_id = iy.icme_year_id
WHERE org_id = 33000000)
SELECT *
FROM c, c1
WHERE c1.ic_code = c.icnum
AND c1.year_name BETWEEN c.minyear AND c.maxyear
and c.人员状态<>c1.is_valid
—-
因在sql server 2000中没有分析函数,所以从oracle 建透明网关icme2连接到mssql,用分析函数以人员分组,排序后用lead,再和时间区间进行对比解决,如果大家有更好的方法,可以留言。
打赏
微信扫一扫,打赏作者吧~
最后
以上就是傲娇导师为你收集整理的oracle中取年度的函数,oracle 分析函数实现跨年度比对的全部内容,希望文章能够帮你解决oracle中取年度的函数,oracle 分析函数实现跨年度比对所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复