如何根据配置单元中的日期值创建标志



我有一个如下的示例表:

|  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  |     |

我想要的输出:如果一个人的"startdate"值在"enddate"值的60天(或2个月(内;然后将该人的flg设置为1。否则flg为0。例如:约翰有12月1日开始上班的记录;该人的终止日期之一(2018年11月1日(后60天内。因此,此人的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   |

你知道吗?

日期函数:使用datediffcase
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

使用lag获取前一行的结束日期(每个名称(。在此之后,可以使用max窗口函数和case表达式为每个名称设置flag,该函数检查每个名称是否至少满足一次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

最新更新