首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环SQL记录以获得一段时间内的总仪表读数(如果仪表已交换

循环SQL记录以获得一段时间内的总仪表读数(如果仪表已交换
EN

Stack Overflow用户
提问于 2012-10-18 09:11:35
回答 1查看 580关注 0票数 2

我有一个表格,用来输入每周霍布斯计时表的车辆读数。我需要能够将每辆车在一段时间内使用的总小时数加起来。我遇到的问题是,有时仪表一旦出现故障就会被换出,并被新的仪表替换,而这些仪表是不可编程的,我必须从零小时开始,所以我需要循环检查每个仪表读数,并确定仪表是否已被交换,并在代码中说明这一点。我不是很喜欢游标,但我可能不得不使用游标来创建一个可以工作的存储过程,除非有人有更好的解决方案,我应该尝试一下。我正在想一个CTE可能会有帮助的方法,但目前还没有什么帮助。

表结构为:

代码语言:javascript
复制
ReadingDate Datetime
EquipmentId Int
MeterReading  decimal(18,2)

我计划创建一个累加变量,循环游标中的行,并将读取差值添加到变量中。因此,当我在循环中看到仪表读数小于之前的读数时,我必须有一个仪表交换,并将不得不考虑它。我在想,如果我在下一次读数中向前看,它低于当前读数,我会跳过一次求和操作,然后开始将差值添加到累加变量中。有没有更好的方法呢?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 10:19:22

这将在SqlServer中工作:

代码语言:javascript
复制
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 I was playing with

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12945721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档