2016-01-13 23 views
1

問題獲得的唯一代碼是連續的最多和包括6天緩衝

什麼是運行代碼的開始和結束日期列表?

我知道這是類似於其他差距和島嶼問題已經在這裏,但我還沒有發現由followingtwo問題複雜化的問題:

  • A碼可以開始和結束不止一次
  • A碼可以與直到幷包括間隙6天(這將在下面進一步解釋)

數據

運行

這是T-SQL的數據,我有:

Table 

Code  | Date   
-------------------------------- 
1000  | 01-31-2015  
1000  | 02-01-2015  
1000  | 02-02-2015  
1000  | 02-03-2015  
1000  | 02-09-2015  
1000  | 02-10-2015  
1000  | 02-17-2015  
1001  | 02-01-2015  
1001  | 02-02-2015  
1001  | 02-04-2015  
1001  | 02-05-2015  
1001  | 02-12-2015  
1001  | 02-19-2015 

理想的解決方案

我想我的SQL查詢返回的是:

Code  | StartDate  | EndDate  | Run 
-------------------------------------------------------- 
1000  | 01-31-2015 | 02-10-2015 | 1 
1000  | 02-17-2015 | 02-17-2015 | 2 
1001  | 02-01-2015 | 02-05-2015 | 3 
1001  | 02-12-2015 | 02-12-2015 | 4 
1001  | 02-19-2015 | 02-19-2015 | 5 

爲了進一步解釋,我們舉一個例子:

代碼1000從2015年1月31日到2015年3月2日連續運行。從2015年9月2日至2015年2月2日,有6天的差距。由於6天的差距可以接受,該運行的開始日期定義爲01-31-2015,結束日期定爲02-03-2015。

但是,相比之下,代碼1001運行於2015年2月2日和2015年2月19日。由於它們之間有7天的差距,它們不被認爲是在同一運行中。

所有幫助非常感謝,所以提前謝謝你!

回答

0

您需要確定組的起始位置。在SQL Server 2012+中,您可以使用lag()來實現此目的。然後,通過累積給定行之前的開始數量,您有一個組。而且,對於一個組,您可以進行聚合。

這看起來像:

select code, min(date) as startdate, max(date) as enddate, 
     row_number() over (partition by code order by min(date)) as run 
from (select t.*, 
      sum(IsGroupStart) over (partition by code order by date) as grp 
     from (select t.*, 
        (case when dateadd(day, -6, date) > 
           lag(date) over (partition by code order by date) 
         then 1 else 0 
        end) as IsGroupStart 
      from t 
      ) t 
    ) t 
group by grp, code; 
+0

我編輯的代碼行2:ROW_NUMBER()OVER(ORDER BY mediaCode)的運行得到一個唯一的標識符的每一行但除此之外,這是完美的!謝謝@戈登! – Bhavik