我目前有一张类似于此的表 -
RecordTime Running Fault
-----------------------------------------------
2016-09-15 11:32:01.00 0 202
2016-09-15 11:32:08.00 1 202
2016-09-15 11:39:31.00 0 21
2016-09-15 11:40:07.00 1 4
2016-09-15 11:42:11.00 0 21
2016-09-15 11:42:39.00 1 45
然后我想计算每条记录的RecordTimes之间的时差。为此,我使用以下 -
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY RecordTime) AS rn
FROM dbo.Table1
)
SELECT DATEDIFF(second, mc.RecordTime, mp.RecordTime)
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
返回 -
(No column name)
----------------
7
443
36
124
28
303
但实际上我想要做的是在原始表中创建一个计算列,它给出了这些值。这可能吗?
我认为我可以将查询转换为UDF,然后在列中引用它,但我对这种工作不太熟悉。
--- ---编辑
最终结果应为 -
RecordTime Running Fault Diff
--------------------------------------------------------
2016-09-15 11:32:01.00 0 202 7
2016-09-15 11:32:08.00 1 202 443
2016-09-15 11:39:31.00 0 21 36
2016-09-15 11:40:07.00 1 4 124
2016-09-15 11:42:11.00 0 21 28
2016-09-15 11:42:39.00 1 45 303
答案 0 :(得分:4)
我建议您为此目的使用视图:
CREATE VIEW Table1_vw
AS
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY RecordTime) AS rn
FROM dbo.Table1
)
SELECT mc.RecordTime,
mc.Running,
mc.Fault,
DATEDIFF(second, mc.RecordTime, mp.RecordTime) Diff
FROM cte mc
LEFT JOIN cte mp
ON mc.rn = mp.rn - 1
由于您使用的是 SQL Server 2012 ,因此您可以使用LEAD功能:
CREATE VIEW Table1_vw
AS
SELECT RecordTime,
Running,
Fault,
DATEDIFF(second,RecordTime,LEAD(RecordTime,1,NULL) OVER (ORDER BY RecordTime ASC) ) as Diff
FROM Table1
GO
答案 1 :(得分:3)
怎么样:
CREATE FUNCTION GetTimeDiff (@time datetime)
RETURNS INT
AS BEGIN
declare @t1 datetime
DECLARE @Ret int
SELECT @t1 = RecordTime
FROM (
SELECT RecordTime,
ROW_NUMBER() OVER (ORDER BY RecordTime DESC) AS rn
FROM Table1
WHERE RecordTime < @time
) i
WHERE i.rn = 1
SELECT @Ret = DATEDIFF(second, @t1, @time)
RETURN @Ret
END
GO
ALTER TABLE Table1
ADD TimeDiff AS dbo.GetTimeDiff(RecordTime)
GO
您需要为函数添加逻辑以处理NULL @ t1等。
更新以使其适用于下一行:
ROW_NUMBER() OVER (ORDER BY RecordTime ASC) AS rn
FROM Table1
WHERE RecordTime > @time
这使得所有价值观都是积极的而不是消极的:
SELECT @Ret = ABS(DATEDIFF(second, @t1, @time))