希望使用分区来比较前一行中的两个不同列
Looking to use Partitions to Compare Two Different Columns on Previous Rows
我正在使用 SQL Developer 并且正在尝试找到一种创建更新指示器的方法。我有一个 table,其中包含保单编号、生效日期和到期日期。如果某项保单的新生效日期与前一行的到期日期相同,则它应该得到“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
是的,你是对的,你需要使用partition by和order by。以下查询对您有用:
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
我正在使用 SQL Developer 并且正在尝试找到一种创建更新指示器的方法。我有一个 table,其中包含保单编号、生效日期和到期日期。如果某项保单的新生效日期与前一行的到期日期相同,则它应该得到“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
是的,你是对的,你需要使用partition by和order by。以下查询对您有用:
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