根据在另一个表中找到的聚合和范围将列添加到表中
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
,其中包含t2
中v
列中所有值的总和,仅当i_t1
(来自t1
)在该范围内时[i1_t2 , i2_t2]
(来自t2
)。
备选方案#1:
在t2
中生成中间行,对应范围内的每个值ì
。然后,按i
分组并交叉检查i
与i_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_t1
在i1_t2
和i2_t2
之间)
对连接结果进行分组和求和
【讨论】:
还没想过i_t1
在i1_t2
和i2_t2
之间!我认为我在以前的尝试中走得太远了。谢谢!以上是关于根据在另一个表中找到的聚合和范围将列添加到表中的主要内容,如果未能解决你的问题,请参考以下文章