SQL技术问询:如何为Table A添加对应Table B日期范围的平均值列?
问题描述
我有两张SQL表:
表A(TABLE A)
| obj_id | start_date | end_date |
|---|---|---|
| 1 | 2021-03-01 | 2022-08-02 |
| 1 | 2020-06-01 | 2021-07-02 |
| 2 | 2021-05-03 | 2022-08-04 |
| 3 | 2021-04-21 | 2022-06-05 |
表B(TABLE B)
| obj_id | date | value |
|---|---|---|
| 1 | 2021-04-12 | 21.45 |
| 3 | 2022-06-15 | 19.02 |
| 1 | 2020-11-02 | 3.11 |
| 2 | 2022-05-23 | 45.20 |
| 1 | 2022-07-31 | 32.45 |
| 3 | 2021-09-01 | 22.56 |
| 2 | 2021-10-10 | 34.04 |
需要给表A添加一列average_value,值为对应obj_id下,表B中date落在表A对应行start_date与end_date范围内的value的平均值,预期结果如下:
| obj_id | start_date | end_date | average_value | 说明 |
|---|---|---|---|---|
| 1 | 2021-03-01 | 2022-08-02 | 26.95 | 取21.45和32.45的均值,排除3.11(日期不在范围内) |
| 1 | 2020-06-01 | 2021-07-02 | 12.28 | 取3.11和21.45的均值 |
| 2 | 2021-05-03 | 2022-08-04 | 39.62 | 取34.04和45.20的均值 |
| 3 | 2021-04-21 | 2022-06-05 | 22.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
相关产品推荐
相关产品推荐

