CREATE PROCEDURE [dbo].[Record_SteamPointData]
AS
BEGIN
    declare @begin_time datetime
    declare @end_time datetime
    declare @dateinfo datetime;

    set @begin_time = DATEADD(hh, -1, GETDATE());
    set @end_time = DATEADD(hh, -0, GETDATE());
    set @dateinfo = GETDATE();

    WITH LatestSteam AS (
        SELECT 
            T1.monitor_code, 
            T1.steam_flow,
            ROW_NUMBER() OVER (PARTITION BY T1.monitor_code ORDER BY T1.collect_time DESC) AS rn
        FROM ems_record_steam_instant T1
        WHERE T1.collect_time BETWEEN DATEADD(HH, -1, @dateinfo) AND DATEADD(HH, 0, @dateinfo)
    ),
    LatestReport AS (
        SELECT 
            E1.monitor_code, 
            E1.begin_time, 
            E1.instrument_value,
            ROW_NUMBER() OVER (PARTITION BY E1.monitor_code ORDER BY E1.begin_time DESC) AS rn
        FROM ems_report_point_steam E1
    )
    INSERT INTO ems_report_point_steam (monitor_code, expend, instrument_value, begin_time, end_time, record_time) 
    SELECT 
        t1.monitor_code                                                       AS monitor_code,
        CONVERT(DECIMAL(18, 2), ISNULL((t3.steam_flow - t4.instrument_value), 0)) AS expend,
        ISNULL(t3.steam_flow, 0)                                              AS instrument_value,
        DATEADD(HH, -1, @dateinfo)                                            AS begin_time,
        DATEADD(HH, 0, @dateinfo)                                             AS end_time,
        CONVERT(VARCHAR(30), DATEADD(HH, -1, @dateinfo), 120)                 AS record_time
    FROM ems_base_monitor_info t1
    LEFT JOIN LatestSteam t3 ON t1.monitor_code = t3.monitor_code AND t3.rn = 1
    LEFT JOIN LatestReport t4 ON t1.monitor_code = t4.monitor_code AND t4.rn = 1;
END;
GO