SQL值查询在值更改时进行分组

时间:2018-03-29 15:12:14

标签: sql sql-server

我的sql db中有以下数据,

value                   timestamp
    0 ,   2018-03-21 14:32:24.417
    0 ,   2018-03-21 14:33:24.417
    0 ,   2018-03-21 14:34:24.417
    4 ,   2018-03-21 14:35:24.417
    4 ,   2018-03-21 14:36:24.417
    0 ,   2018-03-21 14:37:24.417
    0 ,   2018-03-21 14:38:24.417

我希望结果如下所示

value,               min timestamp , duration of how long value was in this value
    0 ,    2018-03-21 14:32:24.417,     2
    4 ,    2018-03-21 14:35:24.417,     1
    0 ,    2018-03-21 14:37:24.417,     1

我尝试使用铅函数,但由于值重复,它不起作用。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:7)

在SQL-Server上:

select value, min(timestamp), datediff(minute, min(timestamp), max(timestamp)) diff
from
    (select value, [timestamp], 
             sum(reset) over (order by timestamp) as grp
     from 
            (select value, [timestamp],
                    case when coalesce(lag(value) over (order by timestamp), '19000101') <> value then 1 end as reset
             from   tbl) t1
    ) t2
group by value, grp
GO
value | (No column name)    | diff
----: | :------------------ | ---:
    0 | 21/03/2018 14:32:24 |    2
    4 | 21/03/2018 14:35:24 |    1
    0 | 21/03/2018 14:37:24 |    1

dbfiddle here