2017-09-16 81 views
3

我在寫一個查詢以從數據轉儲中獲取SCD 2類型的數據。 我的數據和代碼如下:Teradata查詢中的導致和滯後 - 對於類別

create table promotions 
(
start_date date, 
end_date date, 
promotion_name varchar(50)); 

Insert語句來填充表:

insert into promotions values ('9/1/2017','9/2/2017','P1'); 
insert into promotions values ('9/2/2017','9/3/2017','P1'); 
insert into promotions values ('9/3/2017','9/4/2017','P1'); 
insert into promotions values ('9/4/2017','9/5/2017','P1'); 
insert into promotions values ('9/5/2017','9/6/2017','P2'); 
insert into promotions values ('9/6/2017','9/7/2017','P2'); 
insert into promotions values ('9/7/2017','9/8/2017','P2'); 
insert into promotions values ('9/8/2017','9/9/2017','P2'); 
insert into promotions values ('9/9/2017','9/10/2017','P2'); 
insert into promotions values ('9/10/2017','9/11/2017','P2'); 
insert into promotions values ('9/11/2017','9/12/2017','P3'); 
insert into promotions values ('9/12/2017','9/13/2017','P3'); 
insert into promotions values ('9/13/2017','9/14/2017','P3'); 
insert into promotions values ('9/14/2017','9/15/2017','P3'); 

預期結果:

Date_Start  Date_End  Promotion Name 
9/1/2017  9/4/2017  P1 
9/5/2017  9/10/2017  P2 
9/11/2017  9/13/2017  P3 

查詢我寫:

with cte as (select rank() over (partition by promotion_name order by start_date asc) as "Rank" 
,start_date 
,dateadd(day,-1,start_date) as EndDate 
,promotion_name 
--first_name, last_name 
from dbo.promotions) 
select * from cte where rank=1; 

查詢

start_date EndDate promotion_name 
2017-09-01 2017-08-31 P1 
2017-09-05 2017-09-04 P2 
2017-09-11 2017-09-10 P3 

問題與上述查詢的輸出是,相比於輸出表以上時結束日期是越來越顯示在錯誤的方式, 。

在SQL服務器上,引導和滯後功能解決了這個問題,但是在TERADATA上我無法獲得引導/滯後功能的等價物。

我應該如何去做。我不想創建任何易失性/臨時表,它只是一個簡單的ETL查詢。

回答

1

LAGLEAD只是語法短,你可以把它改寫這樣的:

LAG(col1, n) OVER (PARTITION BY ... ORDER BY col2) 
= 
MIN(col1) OVER (PARTITION BY ... ORDER BY col2 
       ROWS BETWEEN n PRECEDING AND n PRECEDING), 0) 

LEAD(col1, n) OVER (PARTITION BY ... ORDER BY col2) 
= 
MIN(col1) OVER (PARTITION BY ... ORDER BY col2 
       ROWS BETWEEN n FOLLOWING AND n FOLLOWING), 0) 

要獲得一個默認值簡單地使用COALESCE

LAG(col1, n, default) OVER (PARTITION BY ... ORDER BY col2) 
= 
COALESCE(MIN(col1) OVER (PARTITION BY ... ORDER BY col2 
         ROWS BETWEEN n PRECEDING AND n PRECEDING), 0) 
     ,default)