如何在BigQuery中将重复状态值转换为列(登录登出示例)
在BigQuery中实现登录登出记录配对转换
原始数据
| ID | status | login_logout_time |
|---|---|---|
| 24456 | loggedin | 2022-01-03 10:00:00 |
| 24456 | loggedout | 2022-01-03 11:20:00 |
| 24456 | loggedin | 2022-01-03 11:30:00 |
| 24456 | loggedout | 2022-01-03 13:00:00 |
| 24456 | loggedin | 2022-01-03 13:30:00 |
| 24456 | loggedout | 2022-01-03 16:10:00 |
| 24456 | loggedin | 2022-01-03 16:20:00 |
| 24456 | loggedout | 2022-01-03 19:00:00 |
期望输出
| ID | logged_in | logged_out |
|---|---|---|
| 24456 | 2022-01-03 10:00:00 | 2022-01-03 11:20:00 |
| 24456 | 2022-01-03 11:30:00 | 2022-01-03 13:00:00 |
| 24456 | 2022-01-03 13:30:00 | 2022-01-03 16:10:00 |
| 24456 | 2022-01-03 16:20:00 | 2022-01-03 19:00:00 |
实现方法
方法1:使用LEAD()窗口函数(适用于严格成对的登录登出记录)
利用窗口函数获取每条登录记录的下一条时间(即对应的登出时间),筛选登录状态的记录即可完成配对:
WITH sorted_logs AS ( SELECT ID, status, login_logout_time, -- 按用户分组、时间排序,获取下一条记录的时间 LEAD(login_logout_time) OVER (PARTITION BY ID ORDER BY login_logout_time) AS next_time FROM `你的项目ID.你的数据集ID.你的表名` ) SELECT ID, login_logout_time AS logged_in, next_time AS logged_out FROM sorted_logs WHERE status = 'loggedin' ORDER BY logged_in;
方法2:会话分组聚合(鲁棒性更强,支持处理未登出的异常记录)
通过统计登录次数为每个会话分配唯一ID,再按会话分组聚合提取登录和登出时间:
WITH grouped_logs AS ( SELECT ID, status, login_logout_time, -- 按用户分组,累计登录次数作为会话ID COUNT(IF(status = 'loggedin', 1, NULL)) OVER (PARTITION BY ID ORDER BY login_logout_time) AS session_id FROM `你的项目ID.你的数据集ID.你的表名` ) SELECT ID, MAX(IF(status = 'loggedin', login_logout_time, NULL)) AS logged_in, MAX(IF(status = 'loggedout', login_logout_time, NULL)) AS logged_out FROM grouped_logs GROUP BY ID, session_id ORDER BY logged_in;
内容的提问来源于stack exchange,提问作者Abinash Mohanty
相关产品推荐
相关产品推荐

