Pau*_*aul 2 sql oracle oracle10g
提前感谢您花时间阅读本文,希望能帮助我找到解决方案.我已经被困了好几天(但似乎更多).
我有一个Oracle表,有6个主要列:
1.分组(字符)
2.策略号(字符(7) - 但带前导零的数字)
3.续订号码(字符(2) - 但带前导零的数字)
4 .版本号(字符(4) - 但带前导零的数字)
5.生效日期
6.到期日期
没有列被索引,但它们是索引列.
我需要做的是:
1.查找当前有效的所有记录([到期日期]> Sysdate)
2.找到以前的保单号
结果我想得到:
ID Group Policy Renew Ver PrevID PrevRenew PrevVer
10 A 0001234 04 0003 3 04 0002
22 B 0001111 00 0001 12 00 0000
44 A 0003332 01 0000 31 00 0000
55 C 0003332 28 0010 4 28 0009
Run Code Online (Sandbox Code Playgroud)
规则是:
- 策略和组始终保持不变
- 不同的策略可以存在于不同的组下
- 当策略更新版本从"0000"开始时
- 结果可能包括当前有效的策略和另一个将来有效的策略.以前的政策当然是当前的政策
我坚持的棘手部分是,如果Ver是'0000'并且我将Renew的值减少1以获得PrevRenew,但是然后需要获得版本的最大值以获得PrevVer.
我创建SQL的尝试已经奏效,但它们非常慢.也许你知道一种简单而快捷的方法来完成我正在尝试的结果吗?如果它有用,我会非常乐意发布我所拥有的内容.
非常感谢!
假设由"以前的保单号码"你的意思是"返回ID,Renew以及Ver对于具有相同的行列Group,并Policy与刚刚之前Effective_Date"您可以使用解析函数LAG
SELECT id,
group,
policy,
renew,
ver,
prevID,
prevRenew,
prevVer
FROM (SELECT id,
group,
policy,
renew,
ver,
expiration_date,
lag(id) over (partition by group, policy
order by effective_date) prevID,
lag(renew) over (partition by group, policy
order by effective_date) prevRenew,
lag(ver) over (partition by group, policy
order by effective_date) prevVer
FROM some_table)
WHERE expiration_date > sysdate;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1902 次 |
| 最近记录: |