如何通过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 | LStatus10 | 001 | 010 | 005
10 | 002 | test | 005
10 | 003 | 005 | 005
11 | 001 | 010 | 338
11 | 002 | 338 | 338
内容的提问来源于stack exchange,提问作者user1137370
相关产品推荐
相关产品推荐

