如何通过SQL按字段最大timestamp聚合同表最新字段值并合并?
解决方案
核心需求是按group_id分组,分别获取first_name、last_name两类标签下最新sent_at对应的字段值,再合并成一个字段。你之前用cross join得到全组合,是因为没精准过滤每个标签的最新记录,试试下面两种通用方法:
方法一:窗口函数筛选最新记录 + 条件聚合
SELECT group_id, CONCAT( MAX(CASE WHEN field_label = 'first_name' THEN field_value END), ' ', MAX(CASE WHEN field_label = 'last_name' THEN field_value END) ) AS amalgamated_field FROM ( SELECT group_id, field_label, field_value, -- 给每个group_id+field_label分组,按sent_at倒序排序,最新记录标记为1 ROW_NUMBER() OVER (PARTITION BY group_id, field_label ORDER BY sent_at DESC) AS rn FROM 你的源表名 WHERE field_label IN ('first_name', 'last_name') -- 仅保留需要处理的标签 ) t WHERE rn = 1 -- 只取每个标签的最新记录 GROUP BY group_id;
方法二:先筛选单标签最新记录再关联合并
如果觉得子查询嵌套麻烦,也可以拆分步骤,先分别获取两类标签的最新值,再通过group_id关联合并:
WITH latest_first_name AS ( SELECT group_id, field_value AS first_name FROM ( SELECT group_id, field_value, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY sent_at DESC) AS rn FROM 你的源表名 WHERE field_label = 'first_name' ) t WHERE rn = 1 ), latest_last_name AS ( SELECT group_id, field_value AS last_name FROM ( SELECT group_id, field_value, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY sent_at DESC) AS rn FROM 你的源表名 WHERE field_label = 'last_name' ) t WHERE rn = 1 ) SELECT COALESCE(lfn.group_id, lln.group_id) AS group_id, CONCAT(lfn.first_name, ' ', lln.last_name) AS amalgamated_field FROM latest_first_name lfn FULL JOIN latest_last_name lln ON lfn.group_id = lln.group_id;
关键说明
ROW_NUMBER() OVER (PARTITION BY group_id, field_label ORDER BY sent_at DESC)是核心逻辑:它会把每个group_id下的同标签记录按时间从新到旧排序,最新的那条会被标记为rn=1,这样就能精准过滤出目标记录,避免出现全组合问题。- 如果你用的数据库支持PIVOT语法(比如SQL Server、Oracle),也可以用PIVOT转置实现,但上面两种方法适配绝大多数SQL数据库。
内容的提问来源于stack exchange,提问作者Jaye
相关产品推荐
相关产品推荐

