加入具有最接近列值的行

时间:2017-07-31 05:19:58

标签: sql tsql

我想加入两个表,其中T1Col1 = T2Col1和T1Col2 = T2Col2,找到T1Col3与T2Col3最接近的匹配。一个是仅一行。

表1

 Col1 |Col2  |Col3
 123  |ABC   |20170731000022
 123  |ABC   |20170731000019
 234  |DEF   |20170731110001
 234  |DEF   |20170731110003

表2

 Col1 |Col2  |Col3
 123  |ABC   |20170731000020
 234  |DEF   |20170731110000
 234  |DEF   |20170731110002

输出

 T1Col1  |T1Col2  |T1Col3           |T2Col1  |T2Col2  |T2Col3
 123     |ABC     |20170731000022   |        |        |
 123     |ABC     |20170731000019   |123     |ABC     |20170731000020
 234     |DEF     |20170731110001   |234     |DEF     |20170731110000
 234     |DEF     |20170731110003   |234     |DEF     |20170731110002

1 个答案:

答案 0 :(得分:0)

尝试以下查询,它可以在SQL服务器中运行。希望这有助于解决您的问题。基本上我发现tab1中的col3和tab2中的col3之间存在绝对差异,然后对它们进行排名并选择最小值.He eif multiple rows有相同的排名(差异相同)然后我们选择其中之一。如果你只想要正面的列你需要删除abs

select * from 
(
   select t.*,
   row_number() over(partition by t1col1,t1col2 order by diff asc) as rn 
   from
     (
        select tab1.col1 as t1col1,tab1.col2 t1col2,tab1.col3 
        t1col3,tab2.col1 t2col1,tab2.col2 t2col2,tab2.col3 
        t2col3,abs(tab1.col3-tab2.col3) as diff
        from tab1 join tab2 
        on tab1.col1=tab2.col1
        and tab1.col2=tab2.col2
     )t
    )f where rn=1