2017-03-08 57 views
0

我想知道日期範圍之間的差距,並且需要它通過MM ID區分空隙。用SQL查找Netezza中日期範圍的空白

可以請別人幫我在下面的Netezza解決

INPUT:從2015年3月3日

ID | MM Number | From | To 

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

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

< <缺少一個記錄(例如相同的MM號期間沒有記錄至2015-04-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 

< <想念摹一個記錄(例如:同MM號期間沒有記錄,從2015年8月1日至2015年8月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中運行?

回答

0

你的查詢應該在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;