簡體   English   中英

事件發生時識別日期范圍的T-SQL查詢

[英]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。 然后在相應的列上使用minmax以及必要的分組。

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;

結束日期的邏輯有點棘手:

  • 它是“0”記錄的ReviewDate
  • 如果沒有,則使用最新的ReviewDate

是一個演示它的SQL小提琴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM