[英]T-SQL Query to Identify Date Ranges when an Event Happens
我正在嘗試確定組織在“監視器”列表中的日期范圍。
我的數據如下:
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組織已在我們的監控列表中出現過兩次:2014年3月6日至2014年4月4日,以及2015年3月5日至2017年3月9日。
我試圖通過幾種方式實現這一目標,包括
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
有了這個查詢
select orgcode,orgname,format(min(reviewdate),'M/d/yyyy') as monitorstartdate,format(max(next_dt),'M/d/yyyy') 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,MonitorList
having MonitorList = 1
結果如下
orgcode orgname monitorstartdate monitorenddate
8000 "Organization A" 3/6/2014 12/4/2014
8000 "Organization A" 3/5/2015 3/9/2017
如果人們想要驗證,那么Fiddle鏈接就在這里 。
您可以通過計算每行上或之后的0的數量來識別組。 其余的只是聚合:
select orgcode, orgname, min(ReviewDate) as MonitorStartDate,
coalesce(min(case when monitorlist = 0 then ReviewDate end),
max(ReviewDate)
) as MontiroEndDate
from (select t.*,
sum(case when monitorlist = 0 then 1 else 0 end) over (partition by orgcode order by reviewdate desc) as grp
from t
) t
group by orgcode, orgname, grp
having max(monitorlist) = 1;
結束日期的邏輯有點棘手:
ReviewDate
。 ReviewDate
。 這是一個演示它的SQL小提琴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.