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

如何在BigQuery中基于特定设备值实现行号分段?

按设备连续分段生成编号的实现方案

原始数据

User_idMonthDevice
00101A
00102A
00103B (Base)
00104A
00201C
00202C
00203B (Base)
00204B (Base)
00301A
00302B (Base)
00303A
00304B (Base)

需求说明

按User_id分组、月份顺序排序,将连续相同的设备归为同一段(连续的B (Base)算一段,连续的非B (Base)设备也算一段),生成递增的分段编号rn,期望结果如下:

期望结果

User_idMonthDevicern
00101A1
00102A1
00103B (Base)2
00104A3
00201C1
00202C1
00203B (Base)2
00204B (Base)2
00301A1
00302B (Base)2
00303A3
00304B (Base)4

实现方法

利用SQL窗口函数即可实现,核心思路是:按用户分组、月份排序,标记当前行与上一行设备是否不同,累计标记的总和后加1就是分段编号。

通用SQL代码(支持窗口函数的SQL方言适用,如Hive、Spark SQL、PostgreSQL等)

SELECT 
    User_id,
    Month,
    Device,
    1 + SUM(flag) OVER (PARTITION BY User_id ORDER BY Month) AS rn
FROM (
    SELECT 
        User_id,
        Month,
        Device,
        -- 标记当前行与上一行设备是否不同,不同则记1,否则记0
        CASE 
            WHEN LAG(Device) OVER (PARTITION BY User_id ORDER BY Month) != Device THEN 1
            ELSE 0
        END AS flag
    FROM your_table_name -- 替换为你的表名
) t
ORDER BY User_id, Month;

代码解释

  1. 内层子查询:使用LAG窗口函数获取当前用户上一行的设备,判断当前行与上一行设备是否不同,生成标记字段flag。
  2. 外层查询:对每个用户按月份累计flag的总和,加1后得到分段编号rn——初始段编号为1,每遇到一次设备切换,累计总和加1,对应新的分段编号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:25:29