我有一个使用OPENQUERY
查询的历史数据库。查询会返回许多字段。 TS,MIN和MAX特别令人感兴趣。如果可以在解决方案中使用它,我也可以访问AVG,RNG,STD,SUM和VAR。
MIN和MAX值捕获状态变化,从MIN值到MAX值或从MAX值到MIN值。
TS | MIN | MAX
----------------------+-------+-------
09-JAN-18 16:25:00.0 | 1300 | 1930
09-JAN-18 16:27:00.0 | 1150 | 1300
09-JAN-18 16:31:00.0 | 760 | 1150
09-JAN-18 16:33:00.0 | 760 | 940
09-JAN-18 16:35:00.0 | 940 | 1240
09-JAN-18 16:37:00.0 | 940 | 1240
09-JAN-18 16:39:00.0 | 849 | 940
我正在努力编写一个可以返回“新”值的查询。
所需输出
TS | VALUE
----------------------+---------
09-JAN-18 16:25:00.0 | 1300
09-JAN-18 16:27:00.0 | 1150
09-JAN-18 16:31:00.0 | 760
09-JAN-18 16:33:00.0 | 940
09-JAN-18 16:35:00.0 | 1240
09-JAN-18 16:37:00.0 | 940
09-JAN-18 16:39:00.0 | 849
我可以做一个自我加入并查找上一行中的当前值,但我认为这会分解,例如当我从940到1240并返回时。
答案 0 :(得分:2)
您可以使用LAG
函数获取上一行中字段的值。
select ts,
case when [min] in
(
lag(min, 1, 0) over (order by ts),
lag(max, 1,0) over (order by ts)
) then max else min end
from yourtable
为了应对前后问题,这个杂乱的版本似乎有用
select ts,
case when [min] in (lag(min, 1, 0) over (order by ts) ,lag(max, 1, 0) over (order by ts)) then
case when [max] in (lag(min, 1, 0) over (order by ts) ,lag(max, 1, 0) over (order by ts)) then
case when [min] in (lag(min, 2, 0) over (order by ts) ,lag(max, 2, 0) over (order by ts)) then
min
else
max
end
else
max
end
else
min end
from yourtable