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

如何关联字段值映射不同的两张表并获取最新记录?

解决方案

可以通过窗口函数筛选最新记录 + LEFT JOIN关联映射关系实现需求,具体SQL语句如下:

SELECT 
    ed.id,
    ed.event,
    ds.date AS `Date`,
    -- 按需添加两张表的其他字段,例如 ed.xxx, ds.xxx
    ed.`...` AS estimate_details_fields,
    ds.`...` AS delivery_service_fields
FROM estimate_details ed
LEFT JOIN (
    -- 子查询:筛选delivery_service中每个id+source组合的最新记录
    SELECT 
        id,
        source,
        date,
        -- 按需添加delivery_service的其他字段
        `...`
    FROM (
        SELECT 
            *,
            -- 按id和source分组,按日期倒序排序,标记每条记录的排名
            ROW_NUMBER() OVER (PARTITION BY id, source ORDER BY date DESC) AS rn
        FROM delivery_service
    ) ranked_ds
    WHERE rn = 1 -- 只保留每组第一条(最新记录)
) ds ON 
    ed.id = ds.id 
    -- 通过CASE语句建立event和source的映射关系
    AND ds.source = CASE ed.event 
        WHEN 'checkout' THEN 'makeBasket' 
        WHEN 'buildOrder' THEN 'buildPurchase' 
    END;

逻辑说明

  1. 筛选最新记录:
    内层子查询用ROW_NUMBER()窗口函数,按id和source分组,每组内按date倒序排序,排名为1的就是该组最新的记录。
  2. 关联映射:
    使用LEFT JOIN确保estimate_details的所有数据都被保留,通过CASE语句将event值转换为对应的source值,实现两张表的关联匹配。

替代方案(仅需日期字段时)

如果只需要关联最新日期,不需要delivery_service的其他字段,可简化为:

SELECT 
    ed.id,
    ed.event,
    ds.date AS `Date`,
    ed.`...`
FROM estimate_details ed
LEFT JOIN (
    SELECT 
        id,
        source,
        MAX(date) AS date
    FROM delivery_service
    GROUP BY id, source
) ds ON 
    ed.id = ds.id 
    AND ds.source = CASE ed.event 
        WHEN 'checkout' THEN 'makeBasket' 
        WHEN 'buildOrder' THEN 'buildPurchase' 
    END;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:40