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

如何在BigQuery中查询各用户ID的第二早登录时间

在BigQuery中获取每个用户的第二早登录时间

实现思路

核心是利用窗口函数对每个用户的登录时间分组排序,筛选出位次为2的记录。可根据业务场景(是否存在重复登录时间)选择ROW_NUMBER()、RANK()或NTH_VALUE()等函数。

解决方案1:使用ROW_NUMBER()窗口函数

该方法给每个用户的登录时间按升序分配唯一行号,即使存在相同登录时间,行号也不重复,适合严格区分登录顺序的场景。

WITH ranked_logins AS (
  SELECT
    User_id,
    LoginTime,
    ROW_NUMBER() OVER (PARTITION BY User_id ORDER BY LoginTime ASC) AS login_rank
  FROM
    `your-project.your-dataset.your-table` -- 替换为你的表路径
)
SELECT
  User_id,
  LoginTime AS SecondLoginTime
FROM
  ranked_logins
WHERE
  login_rank = 2;

解决方案2:使用NTH_VALUE()窗口函数

无需额外子查询/CTE,直接在原查询中提取每个用户的第二个最小登录时间,写法更简洁。

SELECT DISTINCT
  User_id,
  NTH_VALUE(LoginTime, 2) OVER (
    PARTITION BY User_id
    ORDER BY LoginTime ASC
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
  ) AS SecondLoginTime
FROM
  `your-project.your-dataset.your-table` -- 替换为你的表路径
WHERE
  NTH_VALUE(LoginTime, 2) OVER (
    PARTITION BY User_id
    ORDER BY LoginTime ASC
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
  ) IS NOT NULL; -- 过滤登录次数不足2次的用户

重复登录时间场景说明

  • 若用户存在重复的最早登录时间,ROW_NUMBER()会给这类记录分配不同行号(1和2),会返回其中一条作为第二早登录时间;
  • 若希望这种场景下不返回结果(无真正“第二早”),可改用RANK()函数,此时重复的最早登录时间会被分配相同排名1,排名2的记录不存在,这类用户会被过滤。

测试结果验证

使用你提供的测试数据执行上述SQL,将得到期望结果:

User_idSecondLoginTime
12022-11-07 09:52:27
22022-11-07 16:46:34

内容的提问来源于stack exchange,提问作者beth_9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:40:28