0
下面是一个有效的SQL查询,用于计算具有重叠的时间差异。
由于某些原因,我需要创建一个视图 - 因此我不能使用临时表TempALMDB。相反,视图以SELECT X.Alarmgroup开始,我必须使用已经创建的视图QV_Alarms。但在这种情况下,输出与临时表的版本不同。重叠---没有临时表结果的时间范围是错的
原始视图包含以下colums: Alarmgroup,AlarmON,AlarmOFF,优先级,...
AlarmOn和AlarmOFF是报警的到达和返回时间。计算是为每个报警组完成的。为了减少每个查询的计算时间,我包括Alarmgroup和Priority(在临时表中)的WHERE子句。第二部分也可以为小组讨论。
我的问题:
1.当我仅使用第2部分(用QV_Alarms替换了4次TempALMDB)时,为什么会得到不同的错误结果?
2.如何在第2部分中包含优先级的WHERE子句?
-- PART 1: Temporary table
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'TempALMDB')
DROP TABLE TempALMDB
Select TOP 500 Alarmgroup, AlarmON, AlarmOff INTO TempALMDB FROM QV_Alarms
WHERE Alarmgroup = 'A1_1_Alarms'
ORDER BY Alarmgroup, AlarmON
--PART 2: Time difference calculation
SELECT X.Alarmgroup, X.Coming, X.Going, Datediff(minute, X.Coming, X.Going)
AS minutes FROM (
SELECT G2.Alarmgroup, Min(G2.Start1) AS Coming, Max(G2.Going1)
AS Going FROM (
SELECT G1.Alarmgroup, Min(G1.Start2) AS Start1, Max(G1.Going2)
AS Going1 FROM (
SELECT T1.Alarmgroup, Min(T1.AlarmON) AS Start2, Max(T1.AlarmOff)
AS Going2 FROM TempALMDB AS T1 INNER JOIN TempALMDB AS T2
ON (T1.Alarmgroup = T2.Alarmgroup AND T1.AlarmON < T2.AlarmOff
AND T1.AlarmOff > T2.AlarmON AND NOT (T1.AlarmON = T2.AlarmON
AND T1.AlarmOff = T2.AlarmOff))
GROUP BY T1.Alarmgroup,
CASE WHEN T1.AlarmON BETWEEN T2.AlarmON AND T2.AlarmOff
THEN T2.AlarmON ELSE T1.AlarmON END,
CASE WHEN T1.AlarmOff BETWEEN T2.AlarmON AND T2.AlarmOff
THEN T2.AlarmOff ELSE T1.AlarmOff END
) AS G1
GROUP BY G1.Alarmgroup, G1.Going2) AS G2
GROUP BY G2.Alarmgroup, G2.Start1
UNION ALL
SELECT U1.Alarmgroup, U1.AlarmON, U1.AlarmOff
FROM TempALMDB AS U1 LEFT JOIN TempALMDB AS U2
ON (U1.Alarmgroup = U2.Alarmgroup AND U1.AlarmON < U2.AlarmOff
AND U1.AlarmOff > U2.AlarmON
AND NOT (U1.AlarmON = U2.AlarmON AND U1.AlarmOff = U2.AlarmOff))
WHERE U2.Alarmgroup IS NULL
) AS X
WHERE X.Alarmgroup = 'A1_1_Alarms'
ORDER BY X.Alarmgroup, X.Coming, X.Going