SQL查询最近连续登录的用户

查看数: 19700 | 评论数: 12 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-4-26 09:28

正文摘要:

SQL> select t.* from user_logon_history t; USER_ID                          USER_NAME     ...

回复

javaanddonet 发表于 2018-4-27 17:52:09
fly2015 发表于 2018-4-27 17:21
我说下我的思路:
1、首先过滤掉明显不符合要求的group by userid having count(1)=max(logindate-2) and  ...

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;
fly2015 发表于 2018-4-27 17:21:10
我说下我的思路:
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:34:37
本帖最后由 hyj 于 2018-4-26 15:35 编辑

画了下楼主的思路,很厉害
1.png
hyj 发表于 2018-4-26 14:30:48
本帖最后由 hyj 于 2018-4-26 14:37 编辑

楼主的方法其实也是可以的。我这里主要是增加了一个自增日期。楼主t.logon_date+1 这个其实也是自增。当然这个可能涉及到游标,实现难度比较大一些。特别纯sql语句。如果结合代码就容易多了
hyj 发表于 2018-4-26 14:25:42
本帖最后由 hyj 于 2018-4-26 14:29 编辑

这里先说下思路,看表中已经对数据排序了。也就是分别按照用户名和日期排序。
首先根据第一条记录,也就是起始日期。然后通过日期函数自增,与数据库中日期比较(疑问:这里的与数据库中的期是指?)。这里是指 LOGON_DATE字段的日期数据,我们新增了一个(字段)数据,就是连续日期。详细如下
USER_ID                          USER_NAME                        LOGON_DATE
-------------------------------- -------------------------------- -----------
1                                ZhangSan                         4/1/2018
1                                ZhangSan                         4/2/2018
1                                ZhangSan                         4/4/2018
1                                ZhangSan                         4/5/2018
1                                ZhangSan                         4/7/2018
2                                LiSi                             4/15/2018
2                                LiSi                             4/16/2018
2                                LiSi                             4/17/2018
3                                WangWu                           4/8/2018
3                                WangWu                           4/9/2018
3                                WangWu                           4/10/2018
3                                WangWu                           4/11/2018首先获取张三的日期,初始日期为4/1/2018,然后初始日期+1,这个是第二天,这个操作是我们自增的。也就是4/2/2018,这时候跟数据中的下一条数据对比4/2/2018 ,正好二者相等,这说明是连续的,然后我们接着自增4/3/2018 ,这时候第三条数据为4/4/2018,而自增的是4/3/2018,这说明到此为止,到第三条已经不连续,这个记录就不符了。


如果自增日期等于当前日期(疑问:这里的当前日期是指?【这个当前日志,也就是数据库中,上面例子LOGON_DATE的数据】),说明是连续的,继续比较。直到找到大于当前日期(疑问:知道找到谁大于当前日期?【如上面示例,自增是4月3号,数据中却是4月4号,所以证明不连续】)。这就说明不连续。当然连续三天的话,再加个过滤条件就可以了。






javaanddonet 发表于 2018-4-26 11:42:19
hyj 发表于 2018-4-26 11:16
这里先说下思路,看表中已经对数据排序了。也就是分别按照用户名和日期排序。首先根据第一条记录,也就是起 ...

这里先说下思路,看表中已经对数据排序了。也就是分别按照用户名和日期排序。
首先根据第一条记录,也就是起始日期。然后通过日期函数自增,与数据库中日期比较(疑问:这里的与数据库中的期是指?)
如果自增日期等于当前日期(疑问:这里的当前日期是指?),说明是连续的,继续比较。直到找到大于当前日期(疑问:知道找到谁大于当前日期?)。这就说明不连续。当然连续三天的话,再加个过滤条件就可以了。

能帮忙解释一下吗?多谢~

javaanddonet 发表于 2018-4-26 11:36:53
fly2015 发表于 2018-4-26 11:29
需求到底是 最近连续3天 还是只要有连续3天 就行,如果是像你描述的 最近连续3天 应该会简单好多

只要连续三天就行,一定是最近的。上个月出现连续登录的三天也可以算是连续登录。
其实如果要加上最近这个条件,只要再最原始的数据表中对logon_data进行最近3天 这个条件先筛选一次就可以了吧?这样以前连续3天以上的登录记录就砍掉了。
fly2015 发表于 2018-4-26 11:29:14
javaanddonet 发表于 2018-4-26 10:30
另外一种思路,自连接:
select t1.*,t2.*,t3.* from user_logon_history t1
left join user_logon_histor ...

需求到底是 最近连续3天 还是只要有连续3天 就行,如果是像你描述的 最近连续3天 应该会简单好多

关闭

推荐上一条 /2 下一条