0

次のSQLクエリにMergeステートメントを導入して、BuildingIdとTimestampに基づいて既存のレコードと一致するものが見つかるかどうかに応じて、レコードを更新するか、テーブルSnapshotに挿入しようとしています。

基本的に、クエリは、BuildingIdに基づいてSnapshotテーブルの最新のレコードを取得することにより、1時間の時間枠に基づいてレコードのスナップショットを作成し、その時間内にあるすべての値を合計します。

-- 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

マージステートメントをまとめてみましたが、「SelectFrom...」で更新を機能させることができるようです。

ありがとう。

編集:

少し遊んだ後、次のクエリがあります。これは、正しいレコードが存在する場合は更新しますが、存在しない場合は挿入しません。

    -- 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);
4

1 に答える 1

3
MERGE BMS_Snapshot target USING (SELECT BMS_Snapshot.BuildingID, ...) 
 source(BuildingID,...)
  ON target.BuildingID = source.BuildingID 
  AND target.Timestamp = source.Timestamp 
WHEN MATCHED THEN 
    UPDATE SET Emissions = source.Emissions, ... 
WHEN NOT MATCHED BY target THEN 
    INSERT (BuildingID, ...) 
    VALUES (source.BuildingID, ...);

現在タブレットを使用しているため、フォーマットについてはご容赦ください。

更新ごとに、ON 句で buildingid のみを見ていますが、タイムスタンプも必要です。buildingid は一致しますが、WHEN MATCHED のフィルターによって更新から除外されます。

于 2012-05-24T01:19:35.330 に答える