查询以返回记录之间的日期差异

时间:2013-06-28 18:42:01

标签: mysql sql teradata

我有一张表没有政策号,状态代码,状态日期。

我希望在使用每个策略的状态日期排序后,了解每个策略的状态日期(具有多个具有不同状态代码的记录)的差异。

状态日期的差异应该只考虑某些状态代码。 例如:考虑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月6日 - 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

1 个答案:

答案 0 :(得分: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. 总结差异
  5. 这转换为以下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
    

    迪特