我基本上有下表,根据班次对设备进行小时阅读。它包含超过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
答案 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
,以使最后的移位(尚未完成)不会出现在结果中。