我一直试图在以下SQL查询中引入合并语句,以更新或将记录插入表格“快照”,取决于能否找到与基于BuildingId和Timestamp的现有记录相符的匹配。
从根本上说,查询根据一个小时的时间框架,通过获得基于BuildingId的“快照”表格中的最新记录,来创建一份记录快照,这些记录是SUMS所有该小时内的值。
-- DECLARE TABLE VARIABLES TO HOLD TEMP DATA
DECLARE @Output table
(
SnapshotId bigint,
BuildingId bigint,
[TimeStamp] datetime
);
-- INSERT ACCUMULATIVE SNAPSHOT DATA INTO BMS_Snapshot TABLE
;WITH Snap (BuildingId, Timestamp_Actual, TimestampRange_Start, TimestampRange_End) AS
(SELECT BMS_Snapshot.BuildingId, MAX(BMS_Snapshot.Timestamp) AS Timestamp_Actual,
dateadd(hh, datediff(hh,0, MAX(BMS_Snapshot.Timestamp)), 0) AS TimestampRange_Start,
dateadd(mi, +59 , dateadd(hh, datediff(hh,0, MAX(BMS_Snapshot.Timestamp)), 0)) AS TimestampRange_End
FROM BMS_Snapshot
GROUP BY BMS_Snapshot.BuildingId)
INSERT INTO BMS_Snapshot
(BuildingId, Timestamp, Emissions, EnergyUse, NABERS, Lighting, Heating,
Cooling, InternalEquipment, Fans, WaterSystems, NotClassified, Electricity,
Gas, Water, Other, [Range])
OUTPUT inserted.SnapshotId, inserted.BuildingId, inserted.TimeStamp INTO @Output
SELECT [Snapshot].BuildingId,
MAX(TimestampRange_End) AS Timestamp,
SUM([Snapshot].Emissions) AS Emissions,
SUM([Snapshot].EnergyUse) AS EnergyUse,
AVG([Snapshot].NABERS) AS NABERS,
SUM([Snapshot].Lighting) AS Lighting,
SUM([Snapshot].Heating) AS Heating,
SUM([Snapshot].Cooling) AS Cooling,
SUM([Snapshot].InternalEquipment) AS InternalEquipment,
SUM([Snapshot].Fans) AS Fans,
SUM([Snapshot].WaterSystems) AS WaterSystems,
SUM([Snapshot].NotClassified) AS NotClassified,
SUM([Snapshot].Electricity) AS Electricity,
SUM([Snapshot].Gas) AS Gas,
SUM([Snapshot].Water) AS Water,
SUM([Snapshot].Other) AS Other,
1 AS [Range]
FROM
Snap INNER JOIN
BMS_Snapshot AS [Snapshot] ON Snap.BuildingId = [Snapshot].BuildingId
WHERE
/* RANGE - FILTER ONLY 10 MINUTE SNAPSHOTS */
[Snapshot].[Range] = 0 AND
[Snapshot].[TimeStamp]
BETWEEN TimestampRange_Start AND TimestampRange_End
GROUP BY [Snapshot].BuildingId
我试着整理合并语句, 但似乎可以让更新与选择从...
谢谢
编辑:
在有人玩弄游戏之后,我现在有以下查询,如果有正确记录,则更新正确记录,但如果不存在,则不插入:
-- INSERT ACCUMULATIVE SNAPSHOT DATA INTO BMS_Snapshot TABLE
;WITH Snap (BuildingId, Timestamp_Actual, TimestampRange_Start, TimestampRange_End) AS
(SELECT BMS_Snapshot.BuildingId, MAX(BMS_Snapshot.Timestamp) AS Timestamp_Actual,
dateadd(hh, datediff(hh,0, MAX(BMS_Snapshot.Timestamp)), 0) AS TimestampRange_Start,
dateadd(mi, +59 , dateadd(hh, datediff(hh,0, MAX(BMS_Snapshot.Timestamp)), 0)) AS TimestampRange_End
FROM BMS_Snapshot
GROUP BY BMS_Snapshot.BuildingId)
MERGE INTO BMS_Snapshot AS t
USING
(SELECT [Snapshot].BuildingId,
MAX(TimestampRange_End) AS Timestamp,
SUM([Snapshot].Emissions) AS Emissions,
SUM([Snapshot].EnergyUse) AS EnergyUse,
AVG([Snapshot].NABERS) AS NABERS,
SUM([Snapshot].Lighting) AS Lighting,
SUM([Snapshot].Heating) AS Heating,
SUM([Snapshot].Cooling) AS Cooling,
SUM([Snapshot].InternalEquipment) AS InternalEquipment,
SUM([Snapshot].Fans) AS Fans,
SUM([Snapshot].WaterSystems) AS WaterSystems,
SUM([Snapshot].NotClassified) AS NotClassified,
SUM([Snapshot].Electricity) AS Electricity,
SUM([Snapshot].Gas) AS Gas,
SUM([Snapshot].Water) AS Water,
SUM([Snapshot].Other) AS Other,
1 AS [Range]
FROM
Snap INNER JOIN
BMS_Snapshot AS [Snapshot] ON Snap.BuildingId = [Snapshot].BuildingId
WHERE
/* RANGE - FILTER ONLY 10 MINUTE SNAPSHOTS */
[Snapshot].[Range] = 0 AND
[Snapshot].[TimeStamp]
BETWEEN TimestampRange_Start AND TimestampRange_End
GROUP BY [Snapshot].BuildingId) As s
ON t.BuildingId = s.BuildingId
WHEN MATCHED AND (t.Timestamp = s.Timestamp AND
t.[Range] = 1) THEN
UPDATE SET
t.Emissions = s.Emissions,
t.EnergyUse = s.EnergyUse,
t.NABERS = s.NABERS,
t.Lighting = s.Lighting,
t.Heating = s.Heating,
t.Cooling = s.Cooling,
t.InternalEquipment = s.InternalEquipment,
t.Fans = s.Fans,
t.WaterSystems = s.WaterSystems,
t.NotClassified = s.NotClassified,
t.Electricity = s.Electricity,
t.Gas = s.Gas,
t.Water = s.Water,
t.Other = s.Other
WHEN NOT MATCHED BY t THEN
INSERT
(BuildingId, Timestamp, EnergyUse, NABERS, Lighting, Heating,
Cooling, InternalEquipment, Fans, WaterSystems, NotClassified,
Electricity, Gas, Water, Other, [Range])
VALUES
(s.BuildingId, s.Timestamp, s.EnergyUse, s.NABERS, s.Lighting, s.Heating,
s.Cooling, s.InternalEquipment, s.Fans, s.WaterSystems, s.NotClassified,
s.Electricity, s.Gas, s.Water, s.Other, 1);