2017-09-07 86 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,它結合了所有的報警編號值的成單排,我想它如果發生報警有報警編號的多個實例多次

我是一個編寫SQL查詢的新手,所以任何幫助都會很棒。

+0

你沒有解釋'alarmstate' –

+0

'Alarmstate'在原有報警表列中包含一個1或0取決於如果報警處於活動狀態。我正在使用它將每個'alarmnumber'的時間分隔爲'AlarmStartTime'和'AlarmEndTime' – Trav

回答

0

由於您沒有明確指定最後一列的目標內容,因此我只會發布解決方案的一部分(僅包含前三個colmns)。

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