等于 1 SQL 的三个连续行
Three consecutive rows that equal 1 SQL
我有姓名、时间和事件的列表(0 或 1):
Name Time EVENT
AA 12:36:34 PM 1
AA 12:36:59 PM 1
AA 12:37:13 PM 1
AA 12:37:24 PM 0
AA 12:38:04 PM 1
AB 12:38:16 PM 0
AB 12:38:26 PM 0
CD 12:38:56 PM 1
CD 12:39:44 PM 0
CD 1:01:51 PM 0
X 1:03:12 PM 1
YS 1:04:20 PM 0
YS 1:12:50 PM 0
我想找到至少连续 3 行(按时间排序)且事件为 1 的名称。
我试过玩 row_numbers 但如果中间输入 0 我无法重置它。关于做什么的任何想法?
有多种方法可以做到这一点。一种不错的方法是使用不同的行号来定义相同的连续事件值组。一个你有组,剩下的只是聚合:
select name, min(time), max(time), count(*)
from (select t.*,
(row_number() over (partition by name order by time) -
row_number() over (partition by name, event order by time)
) as grp
from t
) t
where event = 1
group by name, event, grp
having count(*) >= 3;
我有姓名、时间和事件的列表(0 或 1):
Name Time EVENT
AA 12:36:34 PM 1
AA 12:36:59 PM 1
AA 12:37:13 PM 1
AA 12:37:24 PM 0
AA 12:38:04 PM 1
AB 12:38:16 PM 0
AB 12:38:26 PM 0
CD 12:38:56 PM 1
CD 12:39:44 PM 0
CD 1:01:51 PM 0
X 1:03:12 PM 1
YS 1:04:20 PM 0
YS 1:12:50 PM 0
我想找到至少连续 3 行(按时间排序)且事件为 1 的名称。
我试过玩 row_numbers 但如果中间输入 0 我无法重置它。关于做什么的任何想法?
有多种方法可以做到这一点。一种不错的方法是使用不同的行号来定义相同的连续事件值组。一个你有组,剩下的只是聚合:
select name, min(time), max(time), count(*)
from (select t.*,
(row_number() over (partition by name order by time) -
row_number() over (partition by name, event order by time)
) as grp
from t
) t
where event = 1
group by name, event, grp
having count(*) >= 3;