文章目录
- 题目需求
- 思路一
- 实现一
- 题目来源
题目需求
从登录明细表(user_login_detail)中查询在相同时刻,多地登陆(ip_address不同)的用户。
期望结果如下:
user_id (用户id) |
---|
101 |
102 |
104 |
… |
需要用到的表:
用户登录明细表:user_login_detail
user_id(用户id) | ip_address(ip地址) | login_ts(登录时间) | logout_ts(登出时间) |
---|---|---|---|
101 | 180.149.130.161 | 2021-09-21 08:00:00 | 2021-09-27 08:30:00 |
102 | 120.245.11.2 | 2021-09-22 09:00:00 | 2021-09-27 09:30:00 |
103 | 27.184.97.3 | 2021-09-23 10:00:00 | 2021-09-27 10:30:00 |
思路一
分析题目:多地登录,找出(本次登录时间 < 上一次登出时间) and (本地ip地址 != 上次ip地址) 的用户。
实现一
-- 3) 找出(本次登录时间 < 上一次登出时间) and (本地ip地址 != 上次ip地址) 的用户
select distinct user_id
from (select user_id,ip_address,login_ts,logout_ts,-- 1) 计算上次登出时间(如果为null,则使用本地登录时间)lag(logout_ts, 1, login_ts) over (partition by user_id order by login_ts) last_logout_ts,-- 2) 计算上次登录的ip地址(如果为null,则默认为 '000.000.000.000')lag(ip_address, 1, '000.000.000.000') over (partition by user_id order by login_ts) last_ip_addressfrom user_login_detail) t1
where login_ts < last_logout_tsand ip_address != last_ip_address;
题目来源
http://practice.atguigu.cn/#/question/22/desc?qType=SQL