识别后续行中的新值

时间:2018-01-10 14:03:25

标签: sql sql-server

我有一个使用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并返回时。

1 个答案:

答案 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