2017-09-07 15 views
1

現在、「アラーム」というテーブルのデータにアクセスする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())) 
)` 

現時点での問題は、私がCASEGROUP BY AlarmNumberの前にMAXを使用する場合、それは私はアラームが発生した場合、それはAlarmnumberの複数のインスタンスを持っていると思い、単一の行にAlarmNumberの値の全てを兼ね備えていることです複数回

私はSQLクエリを書くことについての初心者ですので、どんな助けも素晴らしいでしょう。

+0

あなたは、元のアラームテーブルの 'alarmstate' –

+0

' Alarmstate'列を説明していないが1または0によっては含まれています。私はこれを使って 'alarmnumber'ごとの時刻を' AlarmStartTime'と 'AlarmEndTime'に分けました – Trav

答えて

0

最後の列の目標コンテンツが明確に指定されていないため、ソリューションの一部(最初の3つの列のみ)を投稿します。アラームがアクティブであるかどう

SELECT t.alarmNumber, 
    isnull(MAX(CASE WHEN t.alarmstate = 1 THEN CAST(t.[time] as varchar(20)) END), 'Shift Start Time') AlarmStartTime, 
    isnull(MAX(CASE WHEN t.alarmstate = 0 THEN CAST(t.[time] as varchar(20)) END), 'Current Time') AlarmEndTime 
FROM 
(
    SELECT *, row_number() over (partition by alarmnumber, alarmstate order by [time]) al_group 
    FROM Alarms 
) t 
GROUP BY t.alarmNumber, t.al_group 

demo

関連する問題