如何根据两行的id值进行减法?

时间:2019-05-13 03:00:08

标签: tsql

我基本上有下表,根据班次对设备进行小时阅读。它包含超过1500行。我要做的是从上一个班次中减去下一个班次的读数,以便我可以找到该设备的工作时间。

Id      Shift   Eqpmt   HourReading
--      -----   -----   ------------
1       Shift1  E21     2488
2       Shift1  E52     36882
3       Shift1  Q53     2384
4       Shift1  S54     44874
.         .      .        .
.         .      .        .
11      Shift2  E21     2500
12      Shift2  E52     36900
13      Shift2  Q53     2388
14      Shift2  S54     44875
.         .      .        .
.         .      .        .
.         .      .        .
select
         distinct sh.Shift
        ,sh.Eqmpt
        ,(a.HourReading-sh.HourReading) WorkedHrs 
from sh

join (select id,Shift, Eqpmt, HourReading from sh) a on 
a.Eqpmt=sh.Eqpmt and a.id>sh.id

我尝试了上面的脚本,但是它减去了每个班次的值并给了我30000多个记录。实际上,我自己添加了id列来执行该操作,但似乎仍无法正常工作。

这就是我想要得到的

Shift   Eqpmt   WorkedHours
------  -----   ------------
Shift1  E21     12
Shift1  E52     8
Shift1  Q53     4
Shift1  S54     1

1 个答案:

答案 0 :(得分:0)

我认为您尝试的查询将适用于此示例数据,但我认为您在实际数据中有2个以上的移位(例如“ Shift3”,“ Shift4”等)。因此,我认为您可能想看看使用lead

类似的东西:

SELECT *
FROM
(
SELECT shift, eqpmt, lead(hourreading) OVER (PARTITION BY eqpmt ORDER BY id) - hourreading as workedhours
FROM sh
) a
WHERE workedhours is not null;

lead(hourreading) OVER (PARTITION BY eqpmt ORDER BY id)位将获得具有相同eqpmt值的下一行(按ID排序)。我将其包装在外部查询中以检查workedhours is not null,以使最后的移位(尚未完成)不会出现在结果中。