希望使用分区来比较上一行中的两个不同列

时间:2015-01-29 17:49:41

标签: sql oracle window-functions

我正在使用SQL Developer,并且正在尝试找到一种创建续订指标的方法。我有一张表,其中包含保单编号,生效日期和到期日期。如果某个策略的新生效日期与上一行的到期日期相同,那么它应该得到一个" 1"因为它更新了。如果没有新的生效日期,则该政策不会续订。在下面的示例中,策略12345和12389应该得到" 1"和政策12367应得到" 0"。我该怎么做呢?不知何故使用PARTITION BY,ROWS PRECEDING等?

    POLICY_NUMBER    EFFECTIVE_DATE     EXPIRATION_DATE
       12345           20140120            20140720
       12345           20140720            20150120
       12367           20140122            20140722
       12389           20140122            20140722
       12389           20140722            20150122

1 个答案:

答案 0 :(得分:0)

是的,你是对的,你需要使用分区依据和排序依据。以下查询适用于您:

SELECT A.POLICY_NUMBER , 
CASE WHEN A.EXPIRATION_DATE = B.EFFECTIVE_DATE THEN 1 ELSE 0 END AS ISRENEW
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY POLICY_NUMBER ORDER BY POLICY_NUMBER) AS NUM1 , 
POLICY_NUMBER , EFFECTIVE_DATE , EXPIRATION_DATE
FROM POLICYTABLE AS A
) AS A
LEFT OUTER JOIN
(
SELECT ROW_NUMBER() OVER(PARTITION BY POLICY_NUMBER ORDER BY POLICY_NUMBER) AS NUM1 , 
POLICY_NUMBER , EFFECTIVE_DATE , EXPIRATION_DATE
FROM POLICYTABLE AS A
) AS B ON A.NUM1 = B.NUM1 - 1 AND A.POLICY_NUMBER = B.POLICY_NUMBER
WHERE A.NUM1 = 1