2017-02-04 6 views
1

Bitte helfen Sie!LKW-Status in 15-Minuten-Intervallen aka Statusänderungen aka Verwendung

Wir versuchen, in 15-Minuten-Intervallen ein genaues Bild des Status aller unserer LKWs zu erhalten. Ich kann die Statusänderungen durchführen, die alle 15 Minuten vorkamen, aber ein wenig ratlos, wenn es darum geht, zu zählen, was sie in einem vorherigen Intervall waren, wenn sie für ein paar Stunden keine Änderungen vorgenommen haben und das wiederholen Veränderung. es gibt 142 LKWs, also werde ich idealerweise 142 Reihen pro 15 Minuten Intervall bekommen

alle Zeiger/Lösungen würden sehr geschätzt werden.

Ich denke, die Abfrage muss zurückblicken und vorherige Statusänderung finden, dann füllen alle 15 Minuten Intervall mit diesem bis zum nächsten.

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%' 

das ist das Stück Code, den ich seit einem bestimmten Zeitpunkt eine Tabelle mit jeweils 15-Minuten-Intervall machen gefunden:

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 

Antwort

0

Sie können in jedem Intervall den ersten Datensatz erhalten, indem Sie:

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; 

Dann können Sie den vorherigen Wert mit LAG() erhalten:

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; 

Dies füllt nicht die fehlenden Daten aus, aber es erhält den vorherigen Status (der scheinbar der Kern Ihrer Frage ist).

+0

Das ist großartig, wirklich zu schätzen wissen. Wie kommst du auf die nächste Ebene und bekommst 142 LKW-Status pro Intervall? d.h., wenn ein Lastwagen den Status 3 um 13 Uhr annimmt, sollte er für so viele Intervalle, wie es dauert, bis er den Status 4 erreicht, den Status 3 behalten. –

+0

@ApolloGerolymbos. . . Ihre Frage scheint sehr breit zu sein. Es ist unklar, welcher Teil das eigentliche Problem ist. Diese Antwort adressiert, was ich für das Hauptproblem hielt. –

+0

Danke für das Zurückkommen. Eine Kombination aus deiner früheren Hilfe und Google und ich habe es geknackt. Ich habe jetzt den Status jedes LKWs im 15-Minuten-Intervall, auch wenn sie keine Änderung vorgenommen haben, d. H. Die Abfrage schaut zurück und findet die vorherige Änderung. Wenn Sie den Code möchten, lassen Sie es mich wissen, aber es ist zu lang für diesen Kommentar! –

Verwandte Themen