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

Mysql 查询以返回记录之间的日期差,mysql,sql,teradata,Mysql,Sql,Teradata,我有一张带有保单编号、状态代码、状态日期的表格 我想获得每个策略的状态日期的差异。在使用每个策略的状态日期进行排序后,将有多个具有不同状态代码的记录 P>不同的状态日期只应考虑某些状态码。 例如,认为5,6是要考虑的状态代码< /P> 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

我有一张带有保单编号、状态代码、状态日期的表格

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

P>不同的状态日期只应考虑某些状态码。 例如,认为5,6是要考虑的状态代码< /P>
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

您仍然没有指定实际规则,因此此光标逻辑只是一个猜测:

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

找到一行的st_cd为5或6,并记住它是st_日期 找到下一行的st_cd 5/6,并计算两个st_日期之间的差异 重复1和2,直到到达下一个pol_nm 求和差异 这将转换为以下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

迪特尔

你能在写你的问题时再努力一点吗?例如,表中列的名称是什么,输出列是什么?列名是策略号、状态代码、状态日期。为睡眠时间再添加一列。我需要检查睡眠时间是否正确,睡眠时间是否显示在另一个表中,其中仅显示一次保单编号。您是如何选择6月4日和6月1日的记录的?使用什么逻辑?欢迎使用堆栈溢出,迪特!我真的很高兴在这里见到你!嗨,迪特尔,我对需求做了一些修改。现在我有一个名为policy的表。在policy表中有几个字段,但我主要关注policyno、状态代码和状态更改日期。睡眠时间需要根据这些数据来计算。如果某个策略存在状态代码23和27,则该策略应显示睡眠时间,否则不显示例如:策略\u无状态\u Cd状态\u Dt a 8 02/01/2011 a 23 03/30/2011策略\u睡眠时间0我在上面的问题中给出了示例。你能看一下吗?你还没有指定任何规则,我的水晶球也没有告诉我。所以,请你指定一个算法,如何计算睡眠时间。