You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BigQuery中将重复状态值转换为列(登录登出示例)

在BigQuery中实现登录登出记录配对转换

原始数据

IDstatuslogin_logout_time
24456loggedin2022-01-03 10:00:00
24456loggedout2022-01-03 11:20:00
24456loggedin2022-01-03 11:30:00
24456loggedout2022-01-03 13:00:00
24456loggedin2022-01-03 13:30:00
24456loggedout2022-01-03 16:10:00
24456loggedin2022-01-03 16:20:00
24456loggedout2022-01-03 19:00:00

期望输出

IDlogged_inlogged_out
244562022-01-03 10:00:002022-01-03 11:20:00
244562022-01-03 11:30:002022-01-03 13:00:00
244562022-01-03 13:30:002022-01-03 16:10:00
244562022-01-03 16:20:002022-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:35:23