【问题标题】:SQL Query To Join Two Tables On Closest ValueSQL 查询以最接近的值连接两个表
【发布时间】:2015-07-14 18:57:48
【问题描述】:

">“我有以下数据,如下面的前两张图片所示。

dbo.Value1:     ID       Value       Date
                349383   -3268.32    7/14/2015
                573832   -1732.24    7/14/2015
                747583    49.85      7/14/2015
                958383    231.36     7/14/2015
                172737    1734.94    7/14/2015
                593983    25908.29   7/14/2015

dbo.ProductValue: ProductID  ProductValue   UploadDate
                  NULL       -6348          7/14/2015
                  958383      232           7/14/2015
                  172737      1735          7/14/2015
                  NULL        15392         7/14/2015

我想根据 Value 和 Product Value 列将两张表完全连接起来,这样两张表就根据最接近的值连接起来,如下图。有谁知道我怎么能做到这一点?

enter code here: ID      Value      Date        ProductID   ProductValue    UploadDate
                 349383 -3268.32    7/14/2015   NULL        -6348           7/14/2015
                 573832 -1732.24    7/14/2015   NULL         NULL           NULL
                 747583  49.85      7/14/2015   NULL         NULL           NULL
                 958383  231.36     7/14/2015   958383       232            7/14/2015
                 172737  1734.94    7/14/2015   172737       1735           7/14/2015
                 593983  25908.29   7/14/2015   NULL         15392          7/14/2015

【问题讨论】:

  • 我不太确定,根据您的问题,是什么让值“最接近”,以及为什么两行 Product Value 仍然显示空值。你能详细说明一下吗?

标签: sql-server join


【解决方案1】:

不完全确定您要查找的内容,但这将匹配第二个表 id 与 productid 中的行,如果 productid 为空,则它将匹配所有行,并且两者之间差异最小的行价值与产品价值是分配给它的价值。

select *
from
  value v
  outer apply (
    select top 1 *, abs(p.productvalue - v.value) as diff
    from productvalue p
    where (p.productid = v.id or p.productid is null)
    and not exists (select 1 from value v2 where 
        (p.productid = v2.id or p.productid is null) and
        abs(p.productvalue - v.value) > abs(p.productvalue - v2.value))
    order by case when p.productid is null then 2 else 1 end,
      abs(p.productvalue - v.value) asc
  ) p

外层apply with order by会选择最匹配的行,里面的not exists子句只会匹配到product value最接近的行。

你可以在SQL Fiddle测试这个

【讨论】:

  • 感谢您的帮助 JamesZ。这对我有帮助。
猜你喜欢
  • 2013-03-31
  • 1970-01-01
  • 2016-05-27
  • 2015-11-14
  • 2018-03-18
  • 2017-07-05
  • 2020-11-10
相关资源
最近更新 更多