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

如何获取每个唯一id对应sval列最后变更值的首次出现记录

问题描述
  • 需求:获取sval列最后变更值的首次出现记录。针对id=22,71是最后一次变更的取值,需要获取71第一次出现的对应记录;同理针对id=25,74是最后一次变更的取值,需要获取74第一次出现的对应记录。
  • 数据示例如下,需获取示意图中高亮的行记录:
    数据示意图
  • 已尝试代码:
with LastValue as (
  select t.sval
  from test t 
  order by t.date desc 
  limit 1
)
select t.*
from test t
where t.sval = (select sval from LastValue)
  and t.date > (select max(tt.date) from test tt where tt.sval <> (select sval from LastValue))
order by t.date asc
limit 1;
  • 补充说明:不需要按sval分组取全局首次出现记录,而是要获取每个id最后一次变更的sval对应的首次出现记录,示例中最终应返回id为22、25的两条记录。
解决方案

你现有的代码仅支持返回单条记录,没有按id分组处理所有主体的需求,可通过窗口函数分两步实现需求,适配MariaDB 10.6+版本的参考代码如下:

WITH ranked_data AS (
  -- 分组取每个id的最新sval,同时给同id同sval的记录按时间正序排序
  SELECT 
    *,
    FIRST_VALUE(sval) OVER (PARTITION BY id ORDER BY date DESC) AS latest_sval,
    ROW_NUMBER() OVER (PARTITION BY id, sval ORDER BY date ASC) AS sval_first_rn
  FROM test
)
SELECT id, date, sval 
FROM ranked_data
-- 筛选:sval为当前id的最新值,且是该sval在当前id下的首次出现记录
WHERE sval = latest_sval AND sval_first_rn = 1;

该方案用窗口函数的分组能力一次性处理所有id的计算,无需嵌套多层子查询,执行效率和可维护性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:48:04