当组织在我们的“监控”列表中时,我试图确定日期范围。
我的数据如下所示:
OrgCode OrgName ReviewDate MonitorList
8000 Organization A 3/6/2014 1
8000 Organization A 6/4/2014 1
8000 Organization A 9/4/2014 1
8000 Organization A 12/4/2014 0
8000 Organization A 3/5/2015 1
8000 Organization A 6/4/2015 1
8000 Organization A 9/16/2015 1
8000 Organization A 12/16/2015 1
8000 Organization A 3/9/2016 1
8000 Organization A 6/2/2016 1
8000 Organization A 9/8/2016 1
8000 Organization A 12/8/2016 1
8000 Organization A 3/9/2017 0
8000 Organization A 6/14/2018 0
我正在寻找的查询输出如下所示:
OrgCode OrgName MonitorStartDate MonitorEndDate
8000 Organization A 3/6/2014 12/4/2014
8000 Organization A 3/5/2015 3/9/2017
这个组织,即组织 A,已经两次出现在我们的监控列表中:从 3/6/2014 到 12/4/2014,以及 3/5/2015 到 3/9/2017。
我试图通过几种方式来实现这一点,包括,
LEAD()
和 LAG()
;和,GROUP BY OrgCode, OrgName, MonitorList
并将 MonitorStartDate 定义为 MIN(ReviewDate)
和 MonitorEndDate 为 MAX(ReviewDate)
. 第二种方法没有考虑到这些组织可能多次出现在监视列表中/不在监视列表中的事实。我还是觉得
LEAD()
的一些组合或 LAG()
可能会起作用;但是,不是他们自己。你们可以提供的任何指导都会很棒,感谢您的帮助!
最佳答案
当 0
时,使用运行总和将行分类到重新设置值的组中。遇到和lead
获取下一行的日期,因为结束日期必须从遇到的第一个 0 开始。然后使用 min
和 max
在具有必要分组的相应列上。
select orgcode,orgname
,min(case when monitorlist=1 then reviewdate end) as monitorstartdate
,max(next_dt) as monitorenddate
from (select t.*,
sum(case when monitorlist=0 then 1 else 0 end) over(partition by orgcode order by reviewdate) as grp,
lead(reviewdate) over(partition by orgcode order by reviewdate) as next_dt
from tbl t
) t
group by orgcode,orgname,grp
having max(cast(monitorlist as int))=1
关于sql - 事件发生时识别日期范围的 T-SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50490788/