计算MySQL文件中最大的连续会话块

计算MySQL文件中最大的连续会话块,mysql,sql,ranking,Mysql,Sql,Ranking,我的数据集如下所示: respondent_id day_session daydiff nmo876 11/19/2017 0 nmo876 11/20/2017 1 nmo876 11/21/2017 1 nmo876 11/23/2017 2 nmo876 11/24/2017 1 nmo876 11/25/2017 1 nmo876 11/26/2017 1 nmo876 11/27/2017 1 nmo876 11/28/2017 1 n

我的数据集如下所示:

    respondent_id   day_session daydiff
nmo876  11/19/2017  0
nmo876  11/20/2017  1
nmo876  11/21/2017  1
nmo876  11/23/2017  2
nmo876  11/24/2017  1
nmo876  11/25/2017  1
nmo876  11/26/2017  1
nmo876  11/27/2017  1
nmo876  11/28/2017  1
nmo876  11/29/2017  1
nmo876  11/30/2017  1
nmo876  12/1/2017   1
nmo876  12/2/2017   1
nmo876  12/3/2017   1
nmo876  12/4/2017   1
nmo876  12/5/2017   1
nmo876  12/6/2017   1
nmo876  12/7/2017   1
nmo876  12/8/2017   1
nmo876  12/9/2017   1
nmo876  12/10/2017  1
nmo876  12/11/2017  1
nmo876  12/12/2017  1
nmo876  12/13/2017  1
nmo876  12/14/2017  1
nmo876  12/15/2017  1
nmo876  12/16/2017  1
nmo876  12/17/2017  1
nmo876  12/18/2017  1
nmo876  12/19/2017  1
nmo876  12/20/2017  1
nmo876  12/23/2017  3
nmo876  12/24/2017  1
nmo876  12/26/2017  2
nmo876  12/27/2017  1
nmo876  12/28/2017  1
nmo876  12/29/2017  1
nmo876  12/30/2017  1
nmo876  12/31/2017  1
nmo876  1/2/2018    2
nmo876  1/3/2018    1
nmo876  1/4/2018    1
nmo876  1/5/2018    1
我想编写一个脚本,从用户可能有多个连续的day_会话的数据集中选择最大的连续day_会话块,即daydiff=1。对于nmo876,输出为27

下面是代码应计算连续每日会话的最大数据块的更多数据:

jkl567  11/19/2017  1
jkl567  11/20/2017  1
jkl567  11/21/2017  1
jkl567  11/22/2017  1
jkl567  11/23/2017  1
jkl567  11/24/2017  1
jkl567  11/25/2017  1
jkl567  11/26/2017  1
jkl567  11/27/2017  1
jkl567  11/28/2017  1
jkl567  11/29/2017  1
jkl567  11/30/2017  1
jkl567  12/1/2017   1
jkl567  12/2/2017   1
jkl567  12/3/2017   1
jkl567  12/4/2017   1
jkl567  12/5/2017   1
jkl567  12/6/2017   1
jkl567  12/7/2017   1
jkl567  12/8/2017   1
jkl567  12/9/2017   1
jkl567  12/10/2017  1
jkl567  12/11/2017  1
jkl567  12/12/2017  1
jkl567  12/13/2017  1
jkl567  12/14/2017  1
jkl567  12/15/2017  1
jkl567  12/16/2017  1
jkl567  12/17/2017  1
jkl567  12/18/2017  1
jkl567  12/19/2017  1
jkl567  12/20/2017  1
jkl567  12/21/2017  1
jkl567  12/22/2017  1
jkl567  12/23/2017  1
jkl567  12/24/2017  1
jkl567  12/25/2017  1
jkl567  12/26/2017  2
jkl567  12/28/2017  1
jkl567  12/29/2017  3
jkl567  1/1/2018    1
jkl567  1/2/2018    1
jkl567  1/3/2018    1
jkl567  1/4/2018    1

您可以通过使用变量来实现这一点

select respondent_id, max(counter) from (
select respondent_id, day_session, 
 if(daydiff = 1, @counter := @counter + 1, @counter := 0) counter 
 from mydata 
 join (select @counter := 0) d
 order by respondent_id, day_session
) a 
group by respondent_id
解释

内部查询使用附加列作为计数器准备结果,该计数器仅在daydiff为1时递增

外部查询然后合并结果并显示最高值


您可以通过使用变量来实现这一点

select respondent_id, max(counter) from (
select respondent_id, day_session, 
 if(daydiff = 1, @counter := @counter + 1, @counter := 0) counter 
 from mydata 
 join (select @counter := 0) d
 order by respondent_id, day_session
) a 
group by respondent_id
解释

内部查询使用附加列作为计数器准备结果,该计数器仅在daydiff为1时递增

外部查询然后合并结果并显示最高值


从2017年11月24日到2017年12月20日=27天。我不是在这里回答了吗?不,该脚本会将彼此相隔一天的全天会话相加。它不会计算此类会话的最大部分——例如,如果用户从2017年12月1日到2017年12月8日在线,停止两天,然后从2017年12月10日到2017年12月25日在线,第一个脚本将返回20。此问题要求输出14,即仅获取连续会话的第二块。OK可能还需要一个
分组方式
组件,但我坚持从2017年11月24日到2017年12月20日=27天的前提。我没有回答这个问题吗?不,该脚本会将彼此相隔一天的全天会话相加。它不会计算此类会话的最大部分——例如,如果用户从2017年12月1日到2017年12月8日在线,停止两天,然后从2017年12月10日到2017年12月25日在线,第一个脚本将返回20。此问题要求输出14,即仅获取连续会话的第二个块。OK可能还需要一个
group by
组件,但我坚持前提,这可以在没有命令式编程的情况下完成吗?这是SQL,所以使用变量等时性能可能会差得多。除了上面提到的方法之外,我所能想到的就是编写一个存储过程,它使用游标进行迭代,然后进行计算。同样的问题。请看我在这里发布的类似问题的解决方案:。@isaach1000此外,我还看到了您在不同问题中发布的其他答案(尽管是由同一用户发布的)。我认为这与本问题中提供的样本数据不符。例如,“nmo876 12/23/2017 3”在该系列中产生了一个缺口,因此计数器应到此为止,这正是我们的想法。OP需要最长的连续每日会话。这可以在没有命令式编程的情况下完成吗?这是SQL,所以使用变量等时性能可能会差得多。除了上面提到的方法之外,我所能想到的就是编写一个存储过程,它使用游标进行迭代,然后进行计算。同样的问题。请看我在这里发布的类似问题的解决方案:。@isaach1000此外,我还看到了您在不同问题中发布的其他答案(尽管是由同一用户发布的)。我认为这与本问题中提供的样本数据不符。例如,“nmo876 12/23/2017 3”在该系列中产生了一个缺口,因此计数器应到此为止,这正是我们的想法。OP需要最长的连续每日会话。