我的数据如下:
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
答案 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 |