通过切换行和行的差异进行分组

时间:2015-08-07 12:45:45

标签: sql-server tsql group-by gaps-and-islands

我的数据如下:

Date time            Switch Water level
2015/08/07 09:00:00  1      7
2015/08/07 09:05:00  1      7
2015/08/07 09:10:00  1      6
2015/08/07 09:15:00  1      5
2015/08/07 09:20:00  1      5
2015/08/07 12:00:00  0      5
2015/08/07 15:00:00  0      5
2015/08/07 18:00:00  1      5
2015/08/07 18:05:00  1      4
2015/08/07 18:10:00  1      3
2015/08/07 18:15:00  1      2
2015/08/07 21:00:00  0      2
2015/08/08 00:00:00  0      2

我想在'开关'中按不同的1和0组对数据进行分组。柱 我也希望找到组内水位的差异。结果应该是

switch  decrease in water level
1        2
0        0
1        3
0        0

我的第一优先级是按“切换”列分组。
第二要务是找出差异。如果不可能忽略第二优先级,但请帮我分组切换列中不同的1和0组。

如果有人可以帮我这样做,那将是很棒的。

session Start Time           End Time              decrease_in_level
1       2015/08/07 09:00:00  2015/08/07 09:20:00   2
2       2015/08/07 18:00:00  2015/08/07 18:15:00   3

1 个答案:

答案 0 :(得分:0)

这是一个间隙和岛屿问题,解决它的一种方法是使用一些row_number技巧识别感兴趣的岛屿,一旦完成,我们可以应用聚合函数(min和max)来获取第一个和最后一个值在每个分区。

这应该有效:

with c as
(
select 
    *
    , grp = row_number() over (order by datetime)
    - row_number() over (partition by switch order by datetime)
from water
)
select 
    session = row_number() over(order by min(datetime)), 
    [start time] = min(datetime), 
    [end time] = max(datetime), 
    decrease_in_level = max(waterlevel) - min(waterlevel) 
from c
where switch = 1
group by grp
order by min(datetime)

在查询中,我打电话给你表 water ,给定你的样本数据的输出是:

| Session |               Start Time |                 End Time | decrease_in_level |
|---------|--------------------------|--------------------------|-------------------|
|       1 | August, 07 2015 09:00:00 | August, 07 2015 09:20:00 |                 2 |
|       2 | August, 07 2015 18:00:00 | August, 07 2015 18:15:00 |                 3 |

Sample SQL Fiddle