挑战SQL以查找复杂分组中的先前记录

时间:2012-01-20 16:54:52

标签: sql oracle oracle10g

提前感谢您花时间阅读本文,希望能帮助我找到解决方案。我已经被困了好几天(但似乎更多)。

我有一个包含6个主要列的Oracle表:
1.分组(Char)
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

规则是:
   - 政策和小组始终保持不变    - 不同的政策可以存在于不同的群体之下    - 当政策更新时,版本从“0000”开始    - 结果可能包括当前有效的政策和另一项将来有效的政策。以前的政策当然是当前的

我遇到的棘手问题是,如果Ver是'0000'并且我将Renew的值减少1以获得PrevRenew,但是然后需要获得版本的最大值以获得PrevVer。

我创建SQL的尝试已经奏效,但它们非常慢。也许你知道一种简单而快捷的方法来完成我正在尝试的结果吗?如果它有用,我会非常乐意发布我所拥有的内容。

非常感谢!

1 个答案:

答案 0 :(得分:5)

假设“之前的政策号码”是指“返回IDRenewVer列,以查找具有相同Group和{{ 1}}和前一个Policy“您可以使用分析函数Effective_Date

LAG