这项工作实际上是一个机器循环计数,在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
任何人都可以提出类似翻转问题的技巧吗?
答案 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