SQL适应电表读数中的电表翻转

时间:2014-07-16 23:00:24

标签: sql sql-server-2008

这项工作实际上是一个机器循环计数,在32,000时翻到零,但实用程序/电力/里程表类比得到了这个想法。

我们说我们有一个三位数的仪表。在999之后,它将翻到0。

Reading  Value      Difference
      1    990               -
      2    992               2
      3    997               5
      4    003               6 *
      5    008               5

我有一个CTE查询生成行之间的差异,但行

    Cur.Value - Prv.Value as Difference 
由于时钟翻转,上面的读取4

返回-994。 (它应该返回' 6'。)

有人可以提出一个SQL技巧来容纳翻转吗?

例如,这是一个解决SQL缺乏" GREATEST"功能

-- SQL doesn't have LEAST/GREATEST functions so we use a math trick 
-- to return the  greater number:
-- 0.5*((A+B) + abs(A-B))
0.5 * (Cur._VALUE - Prv._VALUE + ABS(Cur._VALUE - Prv._VALUE)) AS Difference 

任何人都可以提出类似翻转问题的技巧吗?

小提琴:http://sqlfiddle.com/#!3/ce9d4/10

1 个答案:

答案 0 :(得分:1)

您可以使用CASE语句检测负值 - 表示翻转条件 - 并对其进行补偿:

--Create CTE
;WITH tblDifference AS
(
    SELECT Row_Number() 
    OVER (ORDER BY Reading) AS RowNumber, Reading, Value
    FROM t1
)
SELECT 
    Cur.Reading AS This, 
    Cur.Value AS ThisRead,
    Prv.Value AS PrevRead,
    CASE WHEN Cur.Value - Prv.Value < 0 -- this happens during a rollover
        THEN Cur.Value - Prv.Value + 1000 -- compensate for the rollover
        ELSE Cur.Value - Prv.Value
    END as Difference 
FROM
tblDifference Cur 
LEFT OUTER JOIN tblDifference Prv
ON Cur.RowNumber=Prv.RowNumber+1
ORDER BY Cur.Reading