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

获取数据表中最后一次从其他值更新为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;

代码解释

  1. 内层子查询:用LAG(name) OVER (ORDER BY ID)为每一行生成previous_name,也就是按ID排序后前一行的name值。
  2. 外层筛选:只保留当前name是'A',且previous_name不是'A'(或者是表中第一行,此时previous_name为NULL)的记录。
  3. 最后按ID降序排序,取第一条结果,就是我们要找的最后一次切换到'A'的记录。

针对你的示例验证

内层子查询会生成如下中间结果:

IDnameprevious_name
1ANULL
2BA
3CB
4AC
5BA
6AB
7AA
8AA

外层筛选后会得到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:47:10