我是靠谱客的博主 傲娇导师,最近开发中收集的这篇文章主要介绍oracle中取年度的函数,oracle 分析函数实现跨年度比对,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

现在遇到这么一个情况

软件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,再和时间区间进行对比解决,如果大家有更好的方法,可以留言。

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~

最后

以上就是傲娇导师为你收集整理的oracle中取年度的函数,oracle 分析函数实现跨年度比对的全部内容,希望文章能够帮你解决oracle中取年度的函数,oracle 分析函数实现跨年度比对所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部