2

我有一张表格,用于输入车辆的每周霍布斯小时表读数。我需要能够将一段时间内每辆车使用的总小时数相加。我遇到的问题是,有时仪表一旦出现故障就会被换掉,并用新仪表代替,这是不可编程的,我必须从零小时开始,所以我需要遍历每个仪表读数并确定仪表是否有被交换并在我的代码中解释它。我对游标并不感兴趣,但可能不得不使用一个来创建一个存储过程,除非有人有更好的解决方案,否则我应该尝试一下。我正在尝试考虑 CTE 可能会有所帮助的方法,但目前还没有。

表结构为:

ReadingDate Datetime
EquipmentId Int
MeterReading  decimal(18,2)

我计划创建一个累积变量,遍历游标中的行并将读数差异添加到变量中。因此,当我循环并看到仪表读数小于以前的读数时,我必须更换仪表并且必须考虑到它。我在想,如果我要向前看下一个读数并且它低于当前读数,我会跳过求和操作一次,然后开始将差异添加到累积变量中。有没有更好的方法来做到这一点?谢谢。

4

1 回答 1

2

这将在 SqlServer 中工作:

SELECT t1b.EquipmentId, 
       t1a.ReadingDate As StartDate, 
       t1b.ReadingDate AS EndDate,
       CASE 
         WHEN t1b.Reading >= t1a.Reading THEN t1b.Reading - t1a.Reading 
         ELSE t1b.Reading
      END AS Hours
FROM MeterReadings AS t1a
JOIN (select t11.EquipmentId, 
             t11.ReadingDate AS Date1, 
             (SELECT MIN(t13.ReadingDate)  
                FROM MeterReadings AS t13 
               WHERE t13.EquipmentId = t11.EquipmentId 
                AND t13.ReadingDate > t11.ReadingDate 
           Group By t13.EquipmentId) AS NextReadingDate
       from MeterReadings AS t11) AS rd ON t1a.EquipmentId = rd.EquipmentId 
                                        AND t1a.ReadingDate = rd.Date1
JOIN MeterReadings as t1b ON t1b.EquipmentId = t1a.EquipmentId 
                          AND t1b.ReadingDate = rd.NextReadingDate
order by t1a.EquipmentId, t1a.readingdate

我正在玩的 SQL Fiddle

于 2012-10-18T02:19:22.090 回答