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

SQL技术问询:如何为Table A添加对应Table B日期范围的平均值列?

问题描述

我有两张SQL表:

表A(TABLE A)

obj_idstart_dateend_date
12021-03-012022-08-02
12020-06-012021-07-02
22021-05-032022-08-04
32021-04-212022-06-05

表B(TABLE B)

obj_iddatevalue
12021-04-1221.45
32022-06-1519.02
12020-11-023.11
22022-05-2345.20
12022-07-3132.45
32021-09-0122.56
22021-10-1034.04

需要给表A添加一列average_value,值为对应obj_id下,表B中date落在表A对应行start_date与end_date范围内的value的平均值,预期结果如下:

obj_idstart_dateend_dateaverage_value说明
12021-03-012022-08-0226.95取21.45和32.45的均值,排除3.11(日期不在范围内)
12020-06-012021-07-0212.28取3.11和21.45的均值
22021-05-032022-08-0439.62取34.04和45.20的均值
32021-04-212022-06-0522.56仅取22.56(19.02的日期超出end_date)

解决方案

可以用关联子查询来实现需求,SQL语句如下:

SELECT 
    a.obj_id,
    a.start_date,
    a.end_date,
    (
        SELECT AVG(b.value)
        FROM TABLE_B b
        WHERE b.obj_id = a.obj_id
          AND b.date BETWEEN a.start_date AND a.end_date
    ) AS average_value
FROM TABLE_A a;

如果需要永久给表A添加这一列,可以分两步操作:

-- 第一步:添加列
ALTER TABLE TABLE_A ADD COLUMN average_value DECIMAL(10,2);

-- 第二步:更新列值
UPDATE TABLE_A a
SET average_value = (
    SELECT AVG(b.value)
    FROM TABLE_B b
    WHERE b.obj_id = a.obj_id
      AND b.date BETWEEN a.start_date AND a.end_date
);

补充说明

  • 关联子查询会针对表A的每一行,在表B中筛选出同obj_id且日期在start_date和end_date之间的记录,计算其value的平均值。
  • 如果某一行没有符合条件的表B记录,average_value会返回NULL,若需要默认值,可使用COALESCE函数,例如COALESCE(AVG(b.value), 0)将NULL转为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:55:18