T-SQL - 创建一个触发器,用过去 90 天内类似记录的平均值来更新更新记录的平均时间?
T-SQL - Create a trigger to update the updated record's average time with the average of similar records over the past 90 days?
我正在尝试创建一个触发器,调用它时,将使用过去 90 天的平均值更新最近更新记录的 RollingAvgTime 列。
系统信息:
SQL 服务器
Table :
- 批处理日志
相关栏目:
- ElapsedTime(计算值,取平均值)
- RollingAvgTime - 需要触发器
- 滚动 StdDev - 需要触发器
- DifferenceFromAvg - 需要触发器
本质上,我试图更新最后三列(以前为空),以便在存储过程更新记录时获得相关信息。
我非常乐意提供更多详细信息!提前致谢!
编辑:这是我现在使用的代码,它可以编译,但不正确。
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
DECLARE @BatchLogNId INT
SELECT
@BatchLogNId = INSERTED.BatchLogNId
FROM
INSERTED
INNER JOIN
DELETED
ON INSERTED.BatchLogNId = DELETED.BatchLogNId
-- It's an update if the record is in BOTH inserted AND deleted
UPDATE BatchLog
SET RollingAvgTime = (
SELECT AVG(ElapsedTime)
FROM BatchLog
WHERE BatchLogNId = @BatchLogNId
AND EndTime <= DATEADD(MONTH, -3, GETDATE())
)
END
GO
决赛:
工作代码!
Use LogilityPHAdmin
GO
DROP TRIGGER TR_BatchLog_Update
GO
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE b
SET RollingAvgTime = (
SELECT AVG(ElapsedTime)
FROM BatchLog b2
WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
AND b2.DivCd = b.DivCd
AND b2.ProgramName = b.ProgramName
AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
UPDATE b
SET RollingStdDev = (
SELECT STDEV(ElapsedTime)
FROM BatchLog b2
WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
AND b2.DivCd = b.DivCd
AND b2.ProgramName = b.ProgramName
AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
UPDATE b
SET DifferenceFromAvg = (b.RollingAvgTime - b.ElapsedTime)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
END
GO
试试这个。请注意 UPDATE 如何连接到插入的 table 以便它将处理多个插入,而不是使用变量。
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE b
SET RollingAvgTime = (
SELECT AVG(DATEDIFF(minute,0,ElapsedTime))
FROM BatchLog b2
WHERE b2.BatchLogNId = b.BatchLogNId
AND b2.EndTime <= DATEADD(MONTH, -3, GETDATE())
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
END
GO
我正在尝试创建一个触发器,调用它时,将使用过去 90 天的平均值更新最近更新记录的 RollingAvgTime 列。
系统信息: SQL 服务器
Table :
- 批处理日志
相关栏目:
- ElapsedTime(计算值,取平均值)
- RollingAvgTime - 需要触发器
- 滚动 StdDev - 需要触发器
- DifferenceFromAvg - 需要触发器
本质上,我试图更新最后三列(以前为空),以便在存储过程更新记录时获得相关信息。
我非常乐意提供更多详细信息!提前致谢!
编辑:这是我现在使用的代码,它可以编译,但不正确。
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
DECLARE @BatchLogNId INT
SELECT
@BatchLogNId = INSERTED.BatchLogNId
FROM
INSERTED
INNER JOIN
DELETED
ON INSERTED.BatchLogNId = DELETED.BatchLogNId
-- It's an update if the record is in BOTH inserted AND deleted
UPDATE BatchLog
SET RollingAvgTime = (
SELECT AVG(ElapsedTime)
FROM BatchLog
WHERE BatchLogNId = @BatchLogNId
AND EndTime <= DATEADD(MONTH, -3, GETDATE())
)
END
GO
决赛:
工作代码!
Use LogilityPHAdmin
GO
DROP TRIGGER TR_BatchLog_Update
GO
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE b
SET RollingAvgTime = (
SELECT AVG(ElapsedTime)
FROM BatchLog b2
WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
AND b2.DivCd = b.DivCd
AND b2.ProgramName = b.ProgramName
AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
UPDATE b
SET RollingStdDev = (
SELECT STDEV(ElapsedTime)
FROM BatchLog b2
WHERE b2.EndTime > DATEADD(MONTH, -3, GETDATE())
AND b2.DivCd = b.DivCd
AND b2.ProgramName = b.ProgramName
AND b2.Successful = 1
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
UPDATE b
SET DifferenceFromAvg = (b.RollingAvgTime - b.ElapsedTime)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
END
GO
试试这个。请注意 UPDATE 如何连接到插入的 table 以便它将处理多个插入,而不是使用变量。
CREATE TRIGGER TR_BatchLog_Update
ON dbo.BatchLog
AFTER UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE b
SET RollingAvgTime = (
SELECT AVG(DATEDIFF(minute,0,ElapsedTime))
FROM BatchLog b2
WHERE b2.BatchLogNId = b.BatchLogNId
AND b2.EndTime <= DATEADD(MONTH, -3, GETDATE())
)
FROM BatchLog b
INNER JOIN inserted I
ON b.BatchLogNId=i.BatchLogNId
END
GO