モバイルデバイス上のユーザーに関するステータス更新を含むテーブルがあります。彼らは、ステータスを変更したり、自分の位置が更新され、新しい行が作成されるたびに私がやろうとしていますSQLは2つの特定の値のみを含む2つの行の時間差を計算します
view_id time_stamp user issue_event original_value new_value
-----------------------------------------------------------------------------------------
6040462 2017-03-20 02:00:43 DerekRoberts Position updated NULL NULL
6040461 2017-03-20 02:04:01 JamesMorrison state changed Active Paused
6040461 2017-03-20 02:08:33 JamesMorrison Position updated NULL NULL
6040462 2017-03-20 02:20:42 DerekRoberts Position updated NULL NULL
6040462 2017-03-20 02:32:29 DerekRoberts state changed Active Paused
6040461 2017-03-20 02:34:11 JamesMorrison state changed Paused Active
6040461 2017-03-20 02:36:22 JamesMorrison Position updated NULL NULL
6040462 2017-03-20 02:52:47 DerekRoberts Position updated NULL NULL
6040462 2017-03-20 03:01:03 DerekRoberts state changed Paused Active
何が各ユーザーがための「一時停止」状態にとどまる時間の長さを見つけることです...これは、[一時停止]値と[新規値]列の[アクティブ]値の間の時間差です。ユーザーごとに
LEAD()を使用して各ユーザーの次の行を見つけることができると考えましたが、一時停止した時間の終了を示す「アクティブ」はめったに次の行ではありません。テーブルを下ろす。
これまでのところ、私のクエリは次のようになります。これを返す
;WITH UserPauseActivity AS
(SELECT [new_value],
ShiftDate = CAST([time_stamp] as DATE),
PauseStartUser = [user],
PauseEndUser = LEAD([user], 1) OVER(ORDER BY [user], [time_stamp]),
PauseStart = [time_stamp],
PauseEnd = LEAD([time_stamp], 1) OVER(ORDER BY [user], [time_stamp]),
PauseStartDate = CAST([time_stamp] AS DATE),
PauseEndDate = CAST(LEAD([time_stamp], 1) OVER(ORDER BY [user], [time_stamp]) AS DATE)
FROM [SAFE].[dbo].[cc_shift_log_view])
SELECT PauseStartUser [user],
ShiftDate,
PauseStart,
PauseEnd,
DATEDIFF(minute, PauseStart, PauseEnd) IdleTime
FROM UserPauseActivity
WHERE [new_value] = 'Paused'
AND PauseEnd IS NOT NULL
AND PauseStartUser = PauseEndUser
AND PauseStartDate = PauseEndDate
AND PauseStartDate >= '2017-03-20 00:00:00' and PauseStartDate <= '2017-03-21 23:59:59'
ORDER BY ShiftDate, [user]
:
user ShiftDate PauseStart PauseEnd IdleTime
---------------------------------------------------------------------------------
JamesMorrison 2017-03-20 2017-03-20 02:04:01 2017-03-20 02:08:33 4
DerekRoberts 2017-03-20 2017-03-20 02:32:29 2017-03-20 02:52:47 20
PauseStart値が正しいですが、PauseEndは適切ではない、の次の行であることその一時停止期間の実際の終了を示す対応する「アクティブ」値を引き継ぐ次の行ではなく、そのユーザーのためのテーブルを作成します。
私はMS SQL Serverを使用しています2012年
複数の一時停止がある場合、ユーザーに複数の行が必要ですか? –
私は、LEADを使用することができます、あなたがどこにいるのか、あなたのサブクエリーを正しく注文すると思います。次の行だけが十分なフィルタリングと順序付けを持つ正しいものになることは可能です。 –
要するに - はい。対応するActiveがなければ、2つの連続した一時停止が存在することは不可能です。デバイスでは一時停止を選択し、一時停止状態からの唯一の選択肢はアクティブに戻ります。だから、たとえ数時間後であっても、「一時停止」のたびに「アクティブ」が常に存在します。 –