如何选择两行之间的差异?

时间:2015-07-13 15:31:56

标签: sql sql-server tsql

以下是我正在寻找的一个例子:

我的数据是以加仑为单位的终身总数。我希望能够在我选择的时间段内将数据显示为运行总计,而不是作为终身总计。例如:

timestamp   lifetimeTotal        runningTotal
1:30            3000                 0
1:31            3001                 1
1:32            3005                 5
1:33            3010                 10

我不确定该怎么做。我正在使用over查看this one等示例,但它并不是我所寻找的:我不想每次都将这些行添加到一起,而是我想添加两行之间的差异。现在我只是选择终身总数并显示它。

有什么想法吗?我会在必要时添加代码,但除了我的select语句之外没有太多要显示的内容;我无法从概念上想办法做到这一点。

2 个答案:

答案 0 :(得分:2)

这可以使用窗口函数轻松完成:

SELECT [timestamp], lifetimeTotal, 
       COALESCE(SUM(diff) OVER (ORDER BY [timestamp]), 0) AS runningTotal
FROM (
SELECT [timestamp], 
       lifetimeTotal,
       lifetimeTotal - LAG(lifetimeTotal) OVER (ORDER BY [timestamp]) AS diff
FROM mytable ) t

上述查询使用LAG来计算当前行与上一行之间的差异。然后在外部查询中使用SUM OVER来计算差异的运行总计。

Demo here

答案 1 :(得分:2)

这应该给出当前的lifetimeTotal和min lifetimeTotal

之间的差异
SELECT timestamp, 
       lifetimeTotal,
       lifetimeTotal - MIN(lifetimeTotal) OVER () as runningTotal
FROM   Table