-2

我有一张表,上面有保单编号、状态代码、状态日期。

在对每项政策的状态日期进行排序后,我想获得每项政策的状态日期的差异(将有多个具有不同状态代码的记录)。

状态日期的差异应仅考虑某些状态代码。例如:认为 5,6 是要考虑的状态代码

pol_nm  st_cd st_date
pol 1   5     1st june
pol 1   6     2nd june
pol 1   7     4th june
pol 1   6     6th june
pol 1   8     9th june
pol 1   9    10th june
pol 1   10   11th june

我应该得到输出

pol_nm  sleep_tm
pol 1     6

这是(6月4日至6月1日)+(6月9日至6月6日)的差异

谁能帮我查询输出?

基于新要求的一些示例:

Policy_No   Status_Cd       Status_Dt       
A                8      02/01/2011      
A                23     03/30/2011  

Policy_Sleep_Time   0
---------------------------------------------------------

Policy_No   Status_Cd    Status_Dt      
B              8        12/29/2011      
B              27         01/28/2012        
B              27         01/28/2012        124
B              34         05/31/2012    

Policy_Sleep_Time   124
---------------------------------------------------------
Policy_No   Status_Cd    Status_Dt      
C              4        02/11/2007      
C              4        02/11/2007

Policy_Sleep_Time   0
---------------------------------------------------------
Policy_No   Status Cd       Status_Dt
D               8       9/17/2012
D               8       9/17/2012
D               8       9/17/2012
D              23       1/1/2013
D               3       2/1/2013
D               5       2/5/2012
D               23      3/1/2013
D               8       3/6/2013
D               8       3/6/2013
D              44       3/9/2013
D               1       3/23/2013

Here the policy sleep time is 35
4

1 回答 1

3

您仍然没有指定实际规则,所以这个游标逻辑只是一个猜测:

按 pol_nm 和 st_date 排序,然后对每个 pol_nm 重复:

  1. 找到 st_cd 为 5 或 6 的行并记住它是 st_date
  2. 找到具有 st_cd <> 5/6 的下一行并计算两个 st_dates 之间的差异
  3. 重复 1 和 2 直到到达下一个 pol_nm
  4. 总结差异

这转化为以下 SQL

SELECT pol_nm, SUM(days)
FROM
 (
   SELECT pol_nm, next_date-MIN(ST_DATE) AS days
   FROM
    (
      SELECT pol_nm, ST_CD, ST_DATE,
        MIN(CASE WHEN ST_CD NOT IN (5,6) THEN ST_DATE END) 
        OVER (PARTITION BY pol_nm 
              ORDER BY ST_DATE
              ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS next_date
      FROM tab
      QUALIFY ST_DATE <> next_date 
    ) AS dt
   GROUP BY pol_nm, next_date
 ) AS dt
GROUP BY pol_nm

迪特

于 2013-06-29T14:19:29.327 回答