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

MySQL 5如何实现按user_id分组、依据前一行event值生成目标列

MySQL5实现分组取前一行判断的逻辑

需求明确:按user_id分组,判断同一分组内当前行的上一行event值是否为0,是则第三列为1,否则为0,分组内第一行默认返回0。


前置说明

SQL表本身是无序的,所以必须存在一个可以明确标识行先后顺序的字段(比如自增主键id),才能保证取到的「上一行」和你Pandas中的行顺序一致,以下示例用自增主键id作为排序依据,你可以替换为自己的排序字段。

测试表构建

CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    event INT
);
-- 插入示例数据
INSERT INTO test(user_id, event) VALUES
(1,1),
(1,0),
(1,1),
(2,1),
(2,0);

MySQL5 实现代码

MySQL5不支持窗口函数,使用用户变量实现逻辑:

SELECT 
    user_id,
    event,
    third_column
FROM (
    SELECT 
        user_id,
        event,
        CASE 
            -- 同一用户分组内,判断上一行event是否为0
            WHEN @prev_user = user_id THEN IF(@prev_event = 0, 1, 0)
            -- 新用户分组第一行,直接返回0
            ELSE 0
        END AS third_column,
        -- 更新变量存储当前行的user_id和event,供下一行判断使用
        @prev_user := user_id,
        @prev_event := event
    FROM test
    -- 初始化用户变量
    CROSS JOIN (SELECT @prev_user := NULL, @prev_event := NULL) AS init
    -- 必须排序:先按user_id分组,再按行顺序排序
    ORDER BY user_id, id
) AS tmp;

执行结果

和你提供的Pandas输出完全一致:

user_ideventthird_column
110
100
111
210
200

注意事项

  • 务必保证ORDER BY子句的正确性,先按user_id排序,再按行顺序字段排序,否则会导致逻辑结果错误。
  • 如果后续升级到MySQL 8+,可以直接用LAG窗口函数简化实现,代码如下:
SELECT 
    user_id,
    event,
    IF(LAG(event) OVER(PARTITION BY user_id ORDER BY id) = 0, 1, 0) AS third_column
FROM test
ORDER BY user_id, id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:04