【问题标题】:Finding rows which don't have continuous date range in db2在 db2 中查找不具有连续日期范围的行
【发布时间】:2017-08-13 23:55:18
【问题描述】:

我有如下数据,并且有数百万行这样的行

MBR     MBR_SPAN     EFF_DT    END_DT           
1   B   1/1/2011    12/31/2011
1   C   1/1/2012    12/31/2012
1   A   2/1/2013    12/31/2013
2   D   1/1/2010    12/31/2010
2   X   1/1/2011    12/31/ 2011

我需要找到与前一个日期范围不连续的每个成员的行。在这种情况下,它是 MBR 1 和 MBR_SPAN A

我没有连续的列来排序和确定哪些应该具有连续的日期范围。它必须通过比较上一行来确定(可能是通过排序eff_dt)

此外,它必须在不创建任何临时表的情况下完成,因为我无权在 db2 中创建表。

谁能帮忙?

【问题讨论】:

    标签: sql date db2


    【解决方案1】:

    这是一种方法:

    select *
    from (select t.*,
                 lag(end_dt) over (partition by mbr order by eff_dt) as prev_end_dt
          from t
         ) t
    where end_dt <> prev_end_dt + 1 day and prev_end_dte is not null;
    

    【讨论】:

      【解决方案2】:

      变化:假设您的表名为“mydate”,并且您希望从上述示例数据中获得单行结果集:
      select * from (select t.*, lag(end_dt) over (partition by mbr order by eff_dt) as prev_end_dt from mydate as t ) x where x.eff_dt <> x.prev_end_dt + 1 day and x.prev_end_dt is not null

      【讨论】:

        【解决方案3】:

        其他方法:

        with tmp as 
        (
          select f1.*, rownumber() over (partition by f1.mbr order by f1.eff_dt, f1.END_DT) as rang
          from yourtablename f1
        )
        select f1.* from tmp f1 
        inner join tmp f2 on f1.mbr=f2.mbr and f1.rang=f2.rang-1 and f1.eff_dt + 1 day <> f2.eff_dt
        

        【讨论】:

          猜你喜欢
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-19
          • 2022-12-21
          • 2016-08-14
          相关资源
          最近更新 更多