Триггер T-SQL для вычитания предыдущего из текущего для вставки в новую таблицу - PullRequest
0 голосов
/ 12 октября 2018

У меня есть таблица SystemReading T-SQL, в которой хранятся показания счетчиков для системы водоснабжения.После того, как на данном сайте будет выполнено следующее чтение, мне нужно вычесть предыдущее чтение из текущего чтения, чтобы получить использование между двумя чтениями для вставки в таблицу SystemUsage.Первая таблица имеет ReadingID (идентификатор), SysMeterID (сайт счетчика), Reading, ReadingDate.Вторая таблица, моя таблица использования, имеет UsageID (идентификатор), SysMeterID (счетчик сайта), Usage, ReadingDate.Мне нужно убедиться, что в триггере используется только предыдущее чтение того же SysMeterID, что и текущее.Раньше я использовал CTE, чтобы найти это использование, но теперь мне нужно, чтобы оно автоматически вычислялось и вставлялось в новую таблицу использования.Любая помощь приветствуется.

Вот мой старый CTE для справки:

 ;WITH tblDifference as (
    SELECT Row_Number() OVER (ORDER BY ReadingID) as RowNumber, Reading, SysMeterID, ReadingDate
    FROM Supplydb.app.SystemReading 
    WHERE SysMeterID = 18

)
SELECT Cur.Reading, Cur.Reading - Prv.Reading as TotalPumped, cur.ReadingDate as Date
FROM tblDifference as Cur
LEFT OUTER JOIN tblDifference Prv
ON Cur.RowNumber = Prv.RowNumber+1
where cur.rownumber = 3
ORDER BY cur.ReadingDate DESC 

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Надеюсь, вы сможете рассчитать использование с помощью этого триггера вставки

    CREATE TRIGGER Tgr_AddUsage ON SystemReading  
    AFTER INSERT
    AS 
    BEGIN
        SET NOCOUNT ON;
        DECLARE @SysMeterID  int

        SELECT @SysMeterID = SysMeterID FROM Inserted

        INSERT INTO SystemUsage (SysMeterID, Usage, ReadingDate)
            SELECT t1.SysMeterID, t1.Reading - t2.Reading as Usage, t1.ReadingDate
              FROM Inserted t1 LEFT OUTER JOIN 
                    (SELECT TOP 2 * FROM SystemReading WHERE SysMeterID = @SysMeterID ORDER BY ReadingID DESC) t2 ON t1.ReadingID <> t2.ReadingID 
    END
    GO
0 голосов
/ 12 октября 2018

Я бы пропустил CTE и использовал бы LAG (разделенный по SysMeterID) и заказывал по мере необходимости для расчета текущего-предыдущего.

...