获取数据表中最后一次从其他值更新为A的记录
找到最后一次从非A值更新为A的记录
要解决这个问题,我们需要定位**最后一次从其他name值切换到'A'**的行——也就是当前行name为'A',且它的上一行(按ID顺序)name不是'A'的记录里,ID最大的那条。针对你的示例数据,目标就是ID=6的行。
通用解决方案(窗口函数法)
这种方法不依赖ID连续,适用性更广,用LAG()窗口函数获取上一行的name值来判断切换条件:
SELECT ID, name FROM ( SELECT ID, name, -- 获取按ID排序的上一行name值 LAG(name) OVER (ORDER BY ID) AS previous_name FROM your_table -- 替换成你的实际表名 ) AS ranked_records -- 筛选当前是A,且上一行不是A的记录 WHERE name = 'A' AND (previous_name != 'A' OR previous_name IS NULL) -- 按ID倒序取最后一条 ORDER BY ID DESC LIMIT 1;
代码解释
- 内层子查询:用
LAG(name) OVER (ORDER BY ID)为每一行生成previous_name,也就是按ID排序后前一行的name值。 - 外层筛选:只保留当前name是'A',且
previous_name不是'A'(或者是表中第一行,此时previous_name为NULL)的记录。 - 最后按ID降序排序,取第一条结果,就是我们要找的最后一次切换到'A'的记录。
针对你的示例验证
内层子查询会生成如下中间结果:
| ID | name | previous_name |
|---|---|---|
| 1 | A | NULL |
| 2 | B | A |
| 3 | C | B |
| 4 | A | C |
| 5 | B | A |
| 6 | A | B |
| 7 | A | A |
| 8 | A | A |
外层筛选后会得到ID=4和6的记录,降序取第一条就是ID=6,完全符合你的需求。
备选方案(ID连续时可用)
如果你的ID是连续递增的,也可以用关联查询实现:
SELECT t1.ID, t1.name FROM your_table t1 LEFT JOIN your_table t2 ON t2.ID = t1.ID - 1 WHERE t1.name = 'A' AND (t2.name != 'A' OR t2.ID IS NULL) ORDER BY t1.ID DESC LIMIT 1;
不过这种方法在ID有断层时会失效,所以更推荐窗口函数的方案。
内容的提问来源于stack exchange,提问作者Amateur.techie
相关产品推荐
相关产品推荐

