我目前有一个与此类似的表格-
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
我建议您为此使用视图:
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