fly2015 发表于 2018-4-27 17:21 1、首先过滤掉明显不符合要求的group by userid having count(1)<3 2、再筛选出每个用户的logindate>=max(logindate-2) and logindate<=max(logindate) --这里得在分组的基础上进行判断吧?使用分组函数?还是其他方法? 3、再group by userid having count(distinct logindate)=3 结果即为所求 select user_id, user_name, logon_date, row_number() over(partiton by user_id order by logon_date) as group_seq from user_logon_history; |
我说下我的思路: 1、首先过滤掉明显不符合要求的group by userid having count(1)<3 2、再筛选出每个用户的logindate>=max(logindate-2) and logindate<=max(logindate) 3、再group by userid having count(distinct logindate)=3 结果即为所求 |
本帖最后由 hyj 于 2018-4-26 15:35 编辑 画了下楼主的思路,很厉害 |
本帖最后由 hyj 于 2018-4-26 14:37 编辑 楼主的方法其实也是可以的。我这里主要是增加了一个自增日期。楼主t.logon_date+1 这个其实也是自增。当然这个可能涉及到游标,实现难度比较大一些。特别纯sql语句。如果结合代码就容易多了 |
本帖最后由 hyj 于 2018-4-26 14:29 编辑 这里先说下思路,看表中已经对数据排序了。也就是分别按照用户名和日期排序。 首先根据第一条记录,也就是起始日期。然后通过日期函数自增,与数据库中日期比较(疑问:这里的与数据库中的期是指?)。这里是指 LOGON_DATE字段的日期数据,我们新增了一个(字段)数据,就是连续日期。详细如下 USER_ID USER_NAME LOGON_DATE 如果自增日期等于当前日期(疑问:这里的当前日期是指?【这个当前日志,也就是数据库中,上面例子LOGON_DATE的数据】),说明是连续的,继续比较。直到找到大于当前日期(疑问:知道找到谁大于当前日期?【如上面示例,自增是4月3号,数据中却是4月4号,所以证明不连续】)。这就说明不连续。当然连续三天的话,再加个过滤条件就可以了。 |
hyj 发表于 2018-4-26 11:16
|
fly2015 发表于 2018-4-26 11:29 只要连续三天就行,一定是最近的。上个月出现连续登录的三天也可以算是连续登录。 其实如果要加上最近这个条件,只要再最原始的数据表中对logon_data进行最近3天 这个条件先筛选一次就可以了吧?这样以前连续3天以上的登录记录就砍掉了。 |
javaanddonet 发表于 2018-4-26 10:30 需求到底是 最近连续3天 还是只要有连续3天 就行,如果是像你描述的 最近连续3天 应该会简单好多 |