首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类别中的领导和滞后

类别中的领导和滞后
EN

Stack Overflow用户
提问于 2017-09-16 16:39:26
回答 1查看 3.5K关注 0票数 4

我正在编写一个查询,以便从数据转储中获得SCD 2类型的数据。我的数据和代码如下:

代码语言:javascript
复制
create table promotions 
(
start_date date,
end_date date,
promotion_name varchar(50));

填充表的插入语句:

代码语言:javascript
复制
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');

预期结果:

代码语言:javascript
复制
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

我编写的查询:

代码语言:javascript
复制
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;

查询输出

代码语言:javascript
复制
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

上面的查询的问题是,与上面的输出表相比,EndDate的显示方式是错误的。

在server上,领导函数和滞后函数解决了这个问题,但是在TERADATA上无法得到等价的领导/lag函数。

我该怎么做。我不想创建任何易失性/临时表,它只是对ETL的简单查询。

EN

回答 1

Stack Overflow用户

发布于 2017-09-16 18:32:42

LAGLEAD只是较短的语法,您可以这样重写它:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46256134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档