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

group by toggling Rows and difference in rows

我有数据如下:

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

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

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

我的首要任务是按 Switch 列分组。
第二要务是找不同。如果不可能忽略第二优先级,但请帮助我在开关列中按不同的 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

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

这应该有效:

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)

在我给你打电话的查询中 table 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