現在、「アラーム」というテーブルのデータにアクセスするSQLクエリを作成しています。このテーブルは、次の形式のように設定されている:私は達成したい何SQL Server、マージ2 1行と制限行グループ化
AlarmNumber | Time | AlarmState -------------|-------|----------- 1046 | 10:30 | 0 1045 | 10:25 | 1 1044 | 10:24 | 0 1046 | 10:24 | 1 1046 | 10:23 | 0 1046 | 10:22 | 1
目標は、アラーム開始時刻を表示することで、次の形式 中に、アラームをソートすることで、アラーム停止時間とアラームアクティブ時間(アラーム終了時間 - アラーム開始時刻)
AlarmNumber | AlarmStartTime | AlarmEndTime | AlarmActiveTime -------------|-----------------|--------------|---------------- 1046 | 10:24 | 10:30 | 00:02 1045 | 10:24 | - | 10:24 + Current Time 1044 | Shift Start Time| 10:30 |10:30 - Shift Start Time 1046 | 10:22 | 10:23 | 00:01
私の現在のコードは、次の(注:_Global_Varsは、タイムゾーンを持つテーブルです):ある
SELECT
TODATETIMEOFFSET([ALARM_START_TIME],0) AT TIME ZONE (SELECT g.LocalTimeZone FROM _Global_Vars as g) AS [ALARM_START_TIME],
TODATETIMEOFFSET(ALARM_FINISH_TIME,0) AT TIME ZONE (SELECT g.LocalTimeZone FROM _Global_Vars as g) AS [ALARM_FINISH_TIME],
DATEDIFF(SS, [ALARM_START_TIME], [ALARM_FINISH_TIME]),
sub.AlarmNumber
FROM
(
SELECT
(a.[Time]) AS AlarmTime,
(a.[AlarmNumber]+1) as AlarmNumber,
(CASE WHEN a.[AlarmState] = 1 THEN a.[Time] END) [ALARM_START_TIME],
(CASE WHEN a.[AlarmState] = 0 THEN a.[Time] END) [ALARM_FINISH_TIME]
FROM [Alarms] as a
WHERE (a.[Time] > DATEADD(mi, - 60.0 * 12, GETUTCDATE()))
)`
現時点での問題は、私がCASE
とGROUP BY AlarmNumber
の前にMAX
を使用する場合、それは私はアラームが発生した場合、それはAlarmnumberの複数のインスタンスを持っていると思い、単一の行にAlarmNumberの値の全てを兼ね備えていることです複数回
私はSQLクエリを書くことについての初心者ですので、どんな助けも素晴らしいでしょう。
あなたは、元のアラームテーブルの 'alarmstate' –
' Alarmstate'列を説明していないが1または0によっては含まれています。私はこれを使って 'alarmnumber'ごとの時刻を' AlarmStartTime'と 'AlarmEndTime'に分けました – Trav