我有一个示例表,如下:
| name | startdate | enddate | flg |
|-------|-----------|------------|-----|
| John | 6/1/2018 | 7/1/2018 | |
| John | 10/1/2018 | 11/1/2018 | |
| John | 12/1/2018 | 12/20/2018 | |
| Ron | 3/1/2017 | 9/1/2017 | |
| Ron | 5/1/2018 | 10/1/2018 | |
| Jacob | 6/10/2018 | 6/12/2018 | |
我要在输出中显示的内容:如果某人在“结束日期”值的60天内(或2个月内)具有“开始日期”;然后将该人的flg设置为1。否则将flg设为0。 例如:John记录了12月1日开始日期;在此人的结束日期之一的60天内(2018年11月1日)。因此,此人的flg设置为1。
因此,输出应如下所示:
| Name | startdate | enddate | flg |
|-------|-----------|------------|-----|
| John | 6/1/2018 | 7/1/2018 | 1 |
| John | 10/1/2018 | 11/1/2018 | 1 |
| John | 12/1/2018 | 12/20/2018 | 1 |
| Ron | 3/1/2017 | 9/1/2017 | 0 |
| Ron | 5/1/2018 | 10/1/2018 | 0 |
| Jacob | 6/10/2018 | 6/12/2018 | 0 |
请问有什么主意吗?
答案 0 :(得分:1)
Date Functions:使用datediff
和case
select Name,startdate,enddate,
case when datediff(enddate,startdate) < 60 then 1 else 0 end flag
from table
如果您要比较上一行的结束日期,请使用lag()
select Name,startdate,enddate,
case when datediff(startdate,prev_enddate) < 60 then 1 else 0 end flag
from
(
select Name,startdate,enddate,
lag(endate) over(partition by Name order by startdate,enddate) as prev_enddate
from table
) t
答案 1 :(得分:0)
使用lag
获取上一行的结束日期(按名称)。之后,可以使用带有flag
表达式的max
窗口函数为每个名称设置case
,该表达式检查每个名称是否至少满足一次60天差异。
select name
,startdate
,enddate
,max(case when datediff(startdate,prev_end_dt) < 60 then 1 else 0 end) over(partition by name) as flag
from (select t.*
,lag(enddate) over(partition by name order by startdate) as prev_end_dt
from table t
) t