首页 » ORACLE 9i-23c » 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,再和时间区间进行对比解决,如果大家有更好的方法,可以留言。

打赏

对不起,这篇文章暂时关闭评论。