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

如何按状态匹配规则关联另一表数据更新目标表对应日期列

你这个需求属于典型的竖表转横表后关联更新,实现逻辑分为两步:先对第一张状态日志表按共同唯一ID做条件聚合,提取出不同状态对应的日期字段,再关联第二张目标表完成字段更新。

首先是核心的行转列查询,你可以先执行这段语句验证转换后的数据是否符合预期(示例中假设两张表的关联唯一键为id,你可以替换为自己实际的表名和字段名):

SELECT 
  id,
  MAX(CASE WHEN status = 'CLAIMED' THEN DATETIME END) AS CLAIMED_DATETIME,
  MAX(CASE WHEN status = 'BOUGHT' THEN DATETIME END) AS BOUGHT_DATETIME,
  MAX(CASE WHEN status = 'RETURNED' THEN DATETIME END) AS RETURNED_DATETIME
FROM 第一张状态表名
GROUP BY id;

这里用MAX聚合函数是为了兼容同个ID同个状态存在多条日志的场景,会自动取最晚的日期;如果需要取最早的日期,替换为MIN即可。如果确认每个ID每个状态只会有一条记录,用MAX/MIN都不会影响结果。

接下来是关联更新的语句,不同数据库语法略有差异:

MySQL 写法

UPDATE 目标表名 oi
JOIN (
  SELECT 
    id,
    MAX(CASE WHEN status = 'CLAIMED' THEN DATETIME END) AS CLAIMED_DATETIME,
    MAX(CASE WHEN status = 'BOUGHT' THEN DATETIME END) AS BOUGHT_DATETIME,
    MAX(CASE WHEN status = 'RETURNED' THEN DATETIME END) AS RETURNED_DATETIME
  FROM 第一张状态表名
  GROUP BY id
) sl ON oi.id = sl.id
SET 
  oi.CLAIMED_DATETIME = sl.CLAIMED_DATETIME,
  oi.BOUGHT_DATETIME = sl.BOUGHT_DATETIME,
  oi.RETURNED_DATETIME = sl.RETURNED_DATETIME;

PostgreSQL 写法

UPDATE 目标表名 oi
SET 
  CLAIMED_DATETIME = sl.CLAIMED_DATETIME,
  BOUGHT_DATETIME = sl.BOUGHT_DATETIME,
  RETURNED_DATETIME = sl.RETURNED_DATETIME
FROM (
  SELECT 
    id,
    MAX(CASE WHEN status = 'CLAIMED' THEN DATETIME END) AS CLAIMED_DATETIME,
    MAX(CASE WHEN status = 'BOUGHT' THEN DATETIME END) AS BOUGHT_DATETIME,
    MAX(CASE WHEN status = 'RETURNED' THEN DATETIME END) AS RETURNED_DATETIME
  FROM 第一张状态表名
  GROUP BY id
) sl
WHERE oi.id = sl.id;

SQL Server 写法

UPDATE oi
SET 
  oi.CLAIMED_DATETIME = sl.CLAIMED_DATETIME,
  oi.BOUGHT_DATETIME = sl.BOUGHT_DATETIME,
  oi.RETURNED_DATETIME = sl.RETURNED_DATETIME
FROM 目标表名 oi
INNER JOIN (
  SELECT 
    id,
    MAX(CASE WHEN status = 'CLAIMED' THEN DATETIME END) AS CLAIMED_DATETIME,
    MAX(CASE WHEN status = 'BOUGHT' THEN DATETIME END) AS BOUGHT_DATETIME,
    MAX(CASE WHEN status = 'RETURNED' THEN DATETIME END) AS RETURNED_DATETIME
  FROM 第一张状态表名
  GROUP BY id
) sl ON oi.id = sl.id;

执行更新前建议先在测试环境验证,或者先通过SELECT语句关联确认匹配的记录和字段值无误后再执行更新操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:15:03