2017-02-04 45 views
1

請幫助!由15分鐘間隔卡車狀態又名狀態變化aka利用

試圖以15分鐘的時間間隔獲得所有卡車狀態的準確畫面。 我可以做每15分鐘發生一次的狀態變化,但是在計算前一個時間間隔內的數值時,如果他們在幾個小時內沒有做任何更改,並且複製這些變化直到他們變成另一個時間間隔更改。有142輛卡車,所以理想情況下,我會得到每15分鐘間隔142行

任何指針/解決方案將非常感激。

我在猜測查詢需要回顧並查找以前的狀態更改,然後每隔15分鐘填充一次,直到下一個。

SELECT top 1000 
RM.RESOURCE_CALLSIGN 
,RM.MESSAGE_DATE 
,DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, MESSAGE_DATE)/15.0, 0) * 15, 0) [Interval] 
,[MESSAGE] 
,RM.STATUS_WAS 
,RM.STATUS_BECAME 
FROM [MOBILISATIONS].[dbo].[RESOURCE_MESSAGE] RM 
where RESOURCE_CALLSIGN like '_____' and MESSAGE like '%status change%' 

這是一段代碼,我發現,以與每15分鐘間隔的表,因爲在給定日期:

declare @timetbl table(t datetime) 
declare @t datetime 
set @t = '2017-01-01 00:00:00' 
while @t <= getdate() 
begin 
insert into @timetbl values (@t) 
set @t = dateadd(mi, 15, @t) 
end 
select * from @timetbl 

回答

0

您可以通過執行獲得每個區間的第一個記錄:

SELECT RM.* 
FROM (SELECT RM.*, 
      DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, MESSAGE_DATE)/15.0, 0) * 15, 0) as [Interval], 
      ROW_NUMBER() OVER (PARTITION BY DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, MESSAGE_DATE)/15.0, 0) * 15, 0) 
           ORDER BY MESSAGE_DATE) as seqnum 
     FROM [STATUSCHANGES].[dbo].[RESOURCE_MESSAGE] RM 
     WHERE RESOURCE_CALLSIGN like '_____' and MESSAGE like '%status change%' 
    ) RM 
WHERE seqnum = 1; 

然後,您可以使用LAG()獲得前值:

SELECT RM.*, 
     (CASE WHEN LAG(MESSAGE_DATE) OVER (ORDER BY MESSAGE_DATE) < DATEADD(MINUTE, -15, MESSAGE_DATE) 
      THEN STATUS 
      ELSE LAG(STATUS) OVER (ORDER BY MESSAGE_DATE) 
     END) as prev_status 
FROM (SELECT RM.*, 
      DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, MESSAGE_DATE)/15.0, 0) * 15, 0) as [Interval], 
      ROW_NUMBER() OVER (PARTITION BY DATEADD(MINUTE, ROUND(DATEDIFF(MINUTE, 0, MESSAGE_DATE)/15.0, 0) * 15, 0) 
           ORDER BY MESSAGE_DATE) as seqnum 
     FROM [STATUSCHANGES].[dbo].[RESOURCE_MESSAGE] RM 
     WHERE RESOURCE_CALLSIGN like '_____' and MESSAGE like '%status change%' 
    ) RM 
WHERE seqnum = 1; 

這並不填寫缺少的數據,但它確實得到以前的狀態(這似乎是你的問題的要點)。

+0

這是偉大的,真的很感激它。你如何把它提升到一個新的水平,並獲得每間隔142卡車狀態?即如果一輛卡車在下午1點進入狀態3,則它應該保持狀態3達到其狀態4所需的時間間隔。 –

+0

@ApolloGerolymbos。 。 。你的問題似乎很廣泛。目前尚不清楚哪一部分是真正的問題。這個答案解決了我認爲的主要問題。 –

+0

謝謝你回來。早期的幫助和谷歌的組合,我已經破解了它。我現在每隔15分鐘就有一輛卡車的狀態,即使他們沒有做出改變,即查詢回顧並發現以前的改變。如果你想要代碼,請讓我知道,但這個評論太長了! –