【问题标题】:Query to return the difference of dates between records查询返回记录之间的日期差
【发布时间】:2013-06-26 15:05:29
【问题描述】:

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

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

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

谁能帮我查询输出?

一些基于新req的例子:

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

【问题讨论】:

  • 你能多花点力气写下你的问题吗?比如表中列的名称是什么,你的输出列是什么?
  • 列名是保单号、状态码、状态日期。
  • 为睡眠时间增加一列。我需要检查睡眠时间是否正确
  • 睡眠时间显示在不同的表格中,其中策略编号仅显示一次
  • 6 月 4 日和 6 月 1 日你是如何挑选记录的?使用什么逻辑?

标签: mysql sql teradata


【解决方案1】:

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

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

  1. 找到 st_cd 为 5 或 6 的行并记住它是 st_date
  2. 找到 st_cd 5/6 的下一行并计算两个 st_date 之间的差异
  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

节食

【讨论】:

  • 欢迎来到 Stack Overflow,Dieter!很高兴在这里见到你!
  • 您好,Dieter,我的要求有一些变化。
  • 现在我有一个名为 policy 的表。在保单表中有几个字段,但我主要关注保单号、状态代码和状态更改日期。睡眠时间需要从中计算出来。如果策略存在状态代码 23 和 27,则该策略应显示为 sleep time ,否则不显示 例如: Policy_No Status_Cd Status_Dt A 8 02/01/2011 A 23 03/30/2011 Policy_Sleep_Time 0
  • 我已经在上面的问题中给出了示例。你能看一下吗?
  • 你仍然没有指定任何规则,我的水晶球也没有告诉我。那么,您能否指定一个如何计算此睡眠时间的算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多