通过切换行和行差异进行分组
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 |
我有数据如下:
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 |