如何获取每个唯一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
相关产品推荐
相关产品推荐

