【问题标题】:SQL to find gaps in date ranges in NetezzaSQL 在 Netezza 中查找日期范围的空白
【发布时间】:2017-03-16 12:00:13
【问题描述】:

我想获取日期范围之间的间隔,并需要它来按 MM ID 分隔间隔。

请有人帮我在 Netezza 中解决以下问题

输入:

ID | MM Number | From | To 

12345|4444444 |2015-01-03 |2015-02-02 

12346|4444444 |2015-02-03 |2015-03-02 

12347|4444444 |2015-04-03 |2015-05-01 

12348|4444444 |2015-05-02 |2015-06-01 

12349|4444444 |2015-06-02 |2015-07-01 

12310|4444444 |2015-07-02 |2015-07-31 

12310|4444444|2015-09-01|2015-09-30 

预期输出:

MM No | Missing Start Date | Missing To Date 
4444444 |2015-03-03 |2015-04-02 
4444444 |2015-08-01 |2015-08-31 

我有一个包含以下数据的表格

create table icr_tmp 
( 
ID VARCHAR2(15), 
NMI VARCHAR2(50), 
INVOICE_START_DATE DATE, 
INVOICE_END_DATE DATE); 

insert into icr_tmp values('12345','4444444','03/01/2015','02/02/2015'); 

insert into icr_tmp values('12346','4444444','03/02/2015','02/03/2015'); 

insert into icr_tmp values('12347','4444444','03/04/2015','01/05/2015'); 

insert into icr_tmp values('12348','4444444','02/05/2015','01/06/2015'); 

insert into icr_tmp values('12349','4444444','02/06/2015','01/07/2015'); 

insert into icr_tmp values('12310','4444444','02/07/2015','31/07/2015'); 

insert into icr_tmp values('12310','4444444','01/09/2015','30/09/2015'); 

以下 SQL 在 oracle 中完美运行,但在 Netezza 中却不行。

select * 
from (
  select nmi,max(invoice_end_date) over(partition by nmi order by invoice_start_date) + 1 start_gap,
    lead(invoice_start_date) over(partition by nmi order by invoice_start_date) - 1 end_gap
  from icr_tmp3
)
where start_gap <= end_gap;

NMI      START_GAP   END_GAP

4444444  2015-03-03  2015-04-02

4444444  2015-08-01  2015-08-31

如何更改上述 SQL 以在 Netezza 中运行?

【问题讨论】:

    标签: sql netezza gaps-and-islands


    【解决方案1】:

    您的查询在 netezza 上应该可以正常工作,我看到的唯一缺少的是子查询的别名,因为如果子查询没有别名,netezza 会抱怨。

    select * 
    from (
      select nmi
      ,max(invoice_end_date) over(partition by nmi order by invoice_start_date) + 1 start_gap,
      lead(invoice_start_date) over(partition by nmi order by invoice_start_date) - 1 end_gap  
      from icr_tmp
    ) foo
    where start_gap <= end_gap;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多