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

如何通过SQL自连接为同表添加对应ID最高序列的状态列?

解决方案:新增LStatus列显示每个ID最高Sequence对应的Status

这个需求其实很常见,核心就是给每个ID分组,找到该组内Sequence最大的行对应的Status,再把这个值填充到同ID的所有行。我给你两种实用的实现方式,适配不同的数据库环境:

方法1:子查询关联(兼容老版本数据库)

如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用分组子查询+关联的方式实现:

SELECT 
    t.ID,
    t.Seq,
    t.Status,
    max_status.Status AS LStatus
FROM your_table t
-- 关联子查询:先找到每个ID的最大Seq,再获取对应的Status
JOIN (
    SELECT 
        sub.ID,
        yt.Status
    FROM (
        SELECT ID, MAX(Seq) AS max_seq
        FROM your_table
        GROUP BY ID
    ) sub
    JOIN your_table yt ON sub.ID = yt.ID AND sub.max_seq = yt.Seq
) max_status ON t.ID = max_status.ID;

方法2:窗口函数(简洁高效,推荐)

如果你的数据库支持窗口函数(MySQL 8+、PostgreSQL、SQL Server、Oracle等现代数据库),用窗口函数会更简洁,性能也更好:

SELECT 
    ID,
    Seq,
    Status,
    -- 按ID分组,将Seq倒序排列后取第一个Status(即最大Seq对应的Status),并广播到同组所有行
    FIRST_VALUE(Status) OVER (
        PARTITION BY ID 
        ORDER BY Seq DESC 
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS LStatus
FROM your_table;

或者也可以用ROW_NUMBER()标记出每个ID内Seq最大的行,再通过窗口聚合获取对应Status:

WITH ranked_rows AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Seq DESC) AS rn
    FROM your_table
)
SELECT 
    ID,
    Seq,
    Status,
    MAX(CASE WHEN rn = 1 THEN Status END) OVER (PARTITION BY ID) AS LStatus
FROM ranked_rows;

结果验证

用你的测试数据运行以上任意一种查询,都会得到你期望的结果:

ID | Seq | Status | LStatus

10 | 001 | 010 | 005
10 | 002 | test | 005
10 | 003 | 005 | 005
11 | 001 | 010 | 338
11 | 002 | 338 | 338

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:09:27