通过选择最小差异连接多列和其中一个整数列
Join on multiple columns and in one of the integer columns join by choosing minimum difference
我得到了 table t1,我想在下面的 a、b 和 c 列中加入 table t2
+---------+---------+---------+
|a |b |c |
+---------+---------+---------+
|473200 |1 |1.-1-1 |
|472400 |10 |1.-1-1 |
|472800 |10 |1.-1-1 |
|473200 |93 |1.-1-1 |
|472800 |26240 |1.-1-1 |
+---------+---------+---------+
t2
+---------+---------+---------+
|a |b |c |
+---------+---------+---------+
|473200 |1 |1.-1-1 |
|472400 |10 |1.-1-1 |
|472800 |10 |1.-1-1 |
|473200 |93 |1.-1-1 |
|472800 |26250 |1.-1-1 |
+---------+---------+---------+
当我只在 a 和 c 上加入时,结果是
+---------+---------+---------+---------+
|t1.b |t2.b |a |c |
+---------+---------+---------+---------+
|93 |1 |473200 |1.-1-1 |
|1 |1 |473200 |1.-1-1 |
|10 |10 |472400 |1.-1-1 |
|10 |10 |472800 |1.-1-1 |
|26240 |10 |472800 |1.-1-1 |
|93 |93 |473200 |1.-1-1 |
|1 |93 |473200 |1.-1-1 |
|10 |26250 |472800 |1.-1-1 |
|26240 |26250 |472800 |1.-1-1 |
+---------+---------+---------+---------+
我试图实现的是将列 b 添加到 'on' 子句,以便在 b 列的最小差异时发生连接。
想要的结果
+---------+---------+---------+---------+
|t1.b |t2.b |a |c |
+---------+---------+---------+---------+
|1 |1 |473200 |1.-1-1 |
|10 |10 |472400 |1.-1-1 |
|10 |10 |472800 |1.-1-1 |
|93 |93 |473200 |1.-1-1 |
|26240 |26250 |472800 |1.-1-1 |
+---------+---------+---------+---------+
我在这里看到了类似的东西
https://dba.stackexchange.com/questions/73804/how-to-retrieve-closest-value-based-on-look-up-table
但不确定如何适用于我的情况。
一个选项是横向连接:
select t1.*, t2.b b2
from t1
cross join lateral (
select t2.*
from t2
where t2.a = t1.a and t2.c = t1.c
order by abs(t2.b - t1.b)
limit 1
)
另一种可能性是 distinct on
- 但您需要 t1
的主键。假设 (a, c)
元组唯一标识 t1
中的每一行,你会去:
select distinct on (t1.a, t1.c) t1.*, t2.b b2
from t1
inner join t2 on t2.a = t1.a and t2.c = t1.c
order by t1.a, t1.c, abs(t2.b - t1.b)
加入表并计算列 c
的差异,然后使用 distinct on
到 return 每个 (a, c)
仅一行按差异排序。
with joined as (
select t1.a, t1.c, t1.b as b1, t2.b as b2, t2.b - t1.b as b_diff
from t1
join t2
on t2.a = t1.a
and t2.b = t1.b
and t1.b <= t2.b
)
select distinct on (a, c) b1, b2, a, c
from joined
order by a, c, b_diff
;
我得到了 table t1,我想在下面的 a、b 和 c 列中加入 table t2
+---------+---------+---------+
|a |b |c |
+---------+---------+---------+
|473200 |1 |1.-1-1 |
|472400 |10 |1.-1-1 |
|472800 |10 |1.-1-1 |
|473200 |93 |1.-1-1 |
|472800 |26240 |1.-1-1 |
+---------+---------+---------+
t2
+---------+---------+---------+
|a |b |c |
+---------+---------+---------+
|473200 |1 |1.-1-1 |
|472400 |10 |1.-1-1 |
|472800 |10 |1.-1-1 |
|473200 |93 |1.-1-1 |
|472800 |26250 |1.-1-1 |
+---------+---------+---------+
当我只在 a 和 c 上加入时,结果是
+---------+---------+---------+---------+
|t1.b |t2.b |a |c |
+---------+---------+---------+---------+
|93 |1 |473200 |1.-1-1 |
|1 |1 |473200 |1.-1-1 |
|10 |10 |472400 |1.-1-1 |
|10 |10 |472800 |1.-1-1 |
|26240 |10 |472800 |1.-1-1 |
|93 |93 |473200 |1.-1-1 |
|1 |93 |473200 |1.-1-1 |
|10 |26250 |472800 |1.-1-1 |
|26240 |26250 |472800 |1.-1-1 |
+---------+---------+---------+---------+
我试图实现的是将列 b 添加到 'on' 子句,以便在 b 列的最小差异时发生连接。
想要的结果
+---------+---------+---------+---------+
|t1.b |t2.b |a |c |
+---------+---------+---------+---------+
|1 |1 |473200 |1.-1-1 |
|10 |10 |472400 |1.-1-1 |
|10 |10 |472800 |1.-1-1 |
|93 |93 |473200 |1.-1-1 |
|26240 |26250 |472800 |1.-1-1 |
+---------+---------+---------+---------+
我在这里看到了类似的东西
https://dba.stackexchange.com/questions/73804/how-to-retrieve-closest-value-based-on-look-up-table
但不确定如何适用于我的情况。
一个选项是横向连接:
select t1.*, t2.b b2
from t1
cross join lateral (
select t2.*
from t2
where t2.a = t1.a and t2.c = t1.c
order by abs(t2.b - t1.b)
limit 1
)
另一种可能性是 distinct on
- 但您需要 t1
的主键。假设 (a, c)
元组唯一标识 t1
中的每一行,你会去:
select distinct on (t1.a, t1.c) t1.*, t2.b b2
from t1
inner join t2 on t2.a = t1.a and t2.c = t1.c
order by t1.a, t1.c, abs(t2.b - t1.b)
加入表并计算列 c
的差异,然后使用 distinct on
到 return 每个 (a, c)
仅一行按差异排序。
with joined as (
select t1.a, t1.c, t1.b as b1, t2.b as b2, t2.b - t1.b as b_diff
from t1
join t2
on t2.a = t1.a
and t2.b = t1.b
and t1.b <= t2.b
)
select distinct on (a, c) b1, b2, a, c
from joined
order by a, c, b_diff
;