根据在另一个表中找到的聚合和范围将列添加到表中

Posted

技术标签:

【中文标题】根据在另一个表中找到的聚合和范围将列添加到表中【英文标题】:Add column to table based on aggregations and ranges found in another table 【发布时间】:2021-05-06 13:14:54 【问题描述】:

给定一个初始表t1

i_t1 tk
400 t1
702 t2

还有第二张桌子t2:

tk i1_t2 i2_t2 v
t20 300 600 0.5
t19 350 550 0.6
t18 370 420 0.7
t17 500 800 0.2
t16 623 751 0.9

我希望得到以下结果:

i_t1 tk tot
400 t1 1.8
702 t2 1.1

这意味着我在表t1 中添加了一个列tot,其中包含t2v 列中所有值的总和,仅当i_t1(来自t1)在该范围内时[i1_t2 , i2_t2](来自t2)。

备选方案#1:

t2中生成中间行,对应范围内的每个值ì。然后,按i 分组并交叉检查ii_t1 中的值。这已在my other post 中讨论过。但是,我注意到,在我的情况下,这将添加很多行(有时是不必要的,因为 t1 中没有匹配项)并产生性能问题。

备选方案#2:(概念)

逐行遍历t1,选择i_t1对应的值(例如400),然后取出下面查询得到的值:

select sum(v) from t2 where ((select i_t1 from t1 limit 1) >= i1_t2) and ((select i_t1 from t1 limit 1) <= i2_t2);

但是,这需要在 t1 的所有行上重复,我不确定如何将结果返回到 t1

有没有更有效的方法来实现这一点?

以下是可用于重现的查询:

create table t1 (i_t1 int, tk varchar(5));
    
insert into t1 (i_t1, tk)
values (400,'t1'),(702,'t2');

create table t2 (tk varchar(5), i1_t2 int, i2_t2 int, v real);

insert into t2 (tk, i1_t2, i2_t2, v)
values ('t20',300,600,0.5),('t19',350,550,0.6),('t18',370,420,0.7),('t17',500,800,0.2),('t16',623,751,0.9);

【问题讨论】:

【参考方案1】:

demo:db<>fiddle

SELECT 
    t1.i_t1, t1.tk,
    SUM(t2.v)                                    -- 2
FROM t1
JOIN t2 ON (t1.i_t1 BETWEEN t2.i1_t2 AND i2_t2)  -- 1
GROUP BY t1.i_t1, t1.tk
    根据您的条件加入(i_t1i1_t2i2_t2 之间) 对连接结果进行分组和求和

【讨论】:

还没想过i_t1i1_t2i2_t2之间!我认为我在以前的尝试中走得太远了。谢谢!

以上是关于根据在另一个表中找到的聚合和范围将列添加到表中的主要内容,如果未能解决你的问题,请参考以下文章

如何将列值从存储过程中的另一个表更新到表中?

根据组内连续两天将指标列添加到表中

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

AJAX如何动态地将行添加到表中

将列从一个表添加到另一个表的正确 MySQL 方法

根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行