计算两行之间的时差

时间:2010-03-01 17:01:25

标签: sql-server database difference-between-rows

我有一张包含以下内容的表格:

DataDate                 Value
2010-03-01 08:31:32.000  100
2010-03-01 08:31:40.000  110
2010-03-01 08:31:42.000  95
2010-03-01 08:31:45.000  101
.                        .
.                        .
.                        .

我需要将值列乘以当前行和上一行之间的时间差,并将整数日的总和相加。

我目前每隔10秒设置一次数据,这样可以在查询中进行简单的转换:

SELECT Sum((Value/6) FROM History WHERE DataDate BETWEEN @startDate and @endDate

@startDate和@endDate今天的日期是00:00:00和11:59:59。

在设置每10秒收集的数据之前,只要值发生变化,就会收集数据。时间方面没有重复条目,最小时差为1秒。

当我不知道读数之间的时间间隔时,如何设置查询以获取行之间的行时间?

我正在使用SQL Server 2005。

2 个答案:

答案 0 :(得分:131)

WITH    rows AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn
        FROM    mytable
        )
SELECT  DATEDIFF(second, mc.DataDate, mp.DataDate)
FROM    rows mc
JOIN    rows mp
ON      mc.rn = mp.rn - 1

在SQL Server 2012 +中:

SELECT  DATEDIFF(second, pDataDate, dataDate)
FROM    (
        SELECT  *,
                LAG(dataDate) OVER (ORDER BY dataDate) pDataDate
        FROM    rows
        ) q
WHERE   pDataDate IS NOT NULL

答案 1 :(得分:4)

如果您不想使用Subselect,可以对Quassnoi的查询进行一些调整:

SELECT
      DATEDIFF(second, LAG(dataDate) OVER (ORDER BY dataDate), dataDate)
FROM  rows
WHERE LAG(dataDate) OVER (ORDER BY dataDate) IS NOT NULL