SQL查询以查找每个用户的活动时间

SQL查询以查找每个用户的活动时间,sql,sqlite,gaps-and-islands,Sql,Sqlite,Gaps And Islands,我们如何使用这些数据来计算每个时期每个用户的活动 user_id date status 101 2018-01-1 1 101 2018-01-2 0 101 2018-01-3 1 101 2018-01-4 1 101 2018-01-5 1 输出: user_id s

我们如何使用这些数据来计算每个时期每个用户的活动

user_id       date            status 
 101        2018-01-1          1 
 101        2018-01-2          0 
 101        2018-01-3          1   
 101        2018-01-4          1 
 101        2018-01-5          1
输出:

 user_id  start_date     end_date  status  length 
   101    2018-01-1    2018-01-1    1      1
   101    2018-01-2    2018-01-2    0      1
   101    2018-01-3    2018-01-5    1      3

这是一个缺口和孤岛问题。您可以使用减去序列将它们组合在一起:

select user_id, status, min(date), max(date),
       julianday(max(date)) - julianday(min(date)) as length
from (select t.*,
             row_number() over (partition by user_id, status order by date) as seqnum
      from t
     ) t
group by user_id, status, date(date, '-' || seqnum || ' day')
order by user_id, length;

非常感谢,但是我怎样才能在最大值(日期)和长度之间添加状态,并重命名最小值(日期)以开始日期???@alirezana。哎呀。我将状态放在
分组依据中,但不放在
选择中。固定的。