1、我用PostGresQL实现了一下,不同数据库实现方式有出入,但思路是一样的:
WITH rq AS ( /* 1、最早登录日期以来的所有日期记录及其排序号生成 */
SELECT rq::date, ROW_NUMBER( ) OVER( ORDER BY rq ) xh FROM generate_series( ( SELECT min( dt )::date FROM activity_user ), current_date - 1, '1 d' ) rq )
, dl AS /* MATERIALIZED */ ( /* 2、提取每个用户每天登录日志(去重,保证一个用户一天只有一条数据) */
SELECT DISTINCT userid, dt::date lt FROM activity_user )
, qb AS ( /* 3、所有用户所有与所有登录日期笛卡尔积 */
SELECT * FROM ( SELECT DISTINCT userid FROM dl ) a/* 这个也可以用用户表替换 */, rq )
, lx AS ( /* 4、关联登录日志,生成日期排序号与各个用户按登记日期排序的序号的差,构建连续登录标志 */
SELECT a.userid, a.rq, a.xh - ROW_NUMBER( ) OVER( PARTITION BY a.userid ORDER BY a.rq ) lxdl
FROM qb a JOIN dl b ON a.userid = b.userid AND a.rq = b.lt )
, tj AS ( /* 5、统计各用户各连续登录的次数 */
SELECT userid, lxdl, count( 1 ) cnt FROM lx GROUP BY userid, lxdl )
, mx AS ( /* 6、统计各用户的最大连续登录天数 */
SELECT userid, max( cnt ) mx FROM tj GROUP BY userid )
SELECT mx, count( 1 ) cnt FROM mx GROUP BY mx; /* 7、统计各最大连续登录天数涉及的用户数量 */
第一步结果(部分):
第二步结果(部分):
第三步结果(部分):
第四步结果(某一用户、部分):
第五步结果(某一用户、部分):
第六步结果(部分):
最后结果(mx 为最大连续登录天数,cnt 为涉及用户数量):
这个思路在MySQL、Oracle以及SQLServer等等常用的数据库中都是可以实现的,我就不一一列举SQL了
2、得到了最大连续登录天数涉及的用户数量,就可以导出到Excel中,通过各种图形展示其分布情况了
分组 dt+userid 取出来最大的一个值 这个意思吗