Given an initial table t1:
| i_t1 | tk |
|---|---|
| 400 | t1 |
| 702 | t2 |
and a second table 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 would like to have the following result:
| i_t1 | tk | tot |
|---|---|---|
| 400 | t1 | 1.8 |
| 702 | t2 | 1.1 |
This means that I add a column tot to table t1 that contains the sum over all values in column v in t2, only when i_t1 (from t1) is within the range [i1_t2 , i2_t2] (from t2).
Alternative #1:
It was to generate intermediate rows in t2 corresponding to each value ì in the range. Then, group by that i and cross check i with the value in i_t1. This has been discussed in my other post. However, I noticed, that this will be adding a lot of rows (sometimes unnecessary, because there is no match in t1) in my case and creates a performance issue.
Alternative #2: (conceptual)
Go through t1 row by row, select the corresponding value of i_t1 (e.g. 400) and then pick up the value resulting from the query below:
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);
However, this requires to be repeated over all rows of t1 and I'm not sure how to bring the result back to t1.
Is there a more efficient way to achieve this?
Here are the queries that can be used to reproduce:
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);