2017-02-04 4 views
1

助けてください!15分間隔でトラックの状態を別名に変える

すべてのトラックの状況を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になる場合、ステータス4になるまでに要する間隔の間、ステータス3のままでなければならない。 –

+0

@ApolloGerolymbos。 。 。あなたの質問は非常に広いようです。どの部分が本当の問題かは不明です。この回答は、私が主な問題だと思ったことに対処しています。 –

+0

帰ってくれてありがとう。あなたの以前の助けとGoogleの組み合わせと私はそれをクラックしました。変更を加えていない場合でも、15分間隔で各トラックの状態を確認できます。つまり、クエリは元の状態に戻り、以前の変更が検出されます。コードをご希望の場合はお知らせくださいが、このコメントには長すぎます! –

関連する問題