Tsql 返回给定阈值的第一个匹配项

Tsql 返回给定阈值的第一个匹配项,tsql,sql-server-2014,Tsql,Sql Server 2014,以下代码返回多个匹配项: IF OBJECT_ID('tempdb..#Thresholds') IS NOT NULL DROP TABLE #Thresholds CREATE TABLE #Thresholds( [Id] [INT] IDENTITY(1,1) NOT NULL, [Threshold] [FLOAT] NOT NULL ) INSERT INTO #Thresholds ([Threshold])

以下代码返回多个匹配项:

    IF OBJECT_ID('tempdb..#Thresholds') IS NOT NULL DROP TABLE #Thresholds

    CREATE TABLE #Thresholds(
        [Id] [INT] IDENTITY(1,1) NOT NULL,
        [Threshold] [FLOAT] NOT NULL
    )
    INSERT INTO #Thresholds ([Threshold]) 
    SELECT 0.076923 UNION 
    SELECT 0.153846 UNION
    SELECT 0.230769 UNION
    SELECT 0.307692 UNION
    SELECT 0.384615 UNION
    SELECT 0.461538 UNION
    SELECT 0.538461 UNION
    SELECT 0.615384 UNION
    SELECT 0.692307 UNION
    SELECT 0.76923 UNION
    SELECT 0.846153 UNION
    SELECT 0.923076 UNION
    SELECT 1

    IF OBJECT_ID('tempdb..#DataToBeJoined') IS NOT NULL DROP TABLE #DataToBeJoined

    CREATE TABLE #DataToBeJoined(
        [Value] [FLOAT] NOT NULL
    )
    INSERT INTO #DataToBeJoined ([Value]) 
    SELECT 0.25 UNION ALL
    SELECT 0.5 UNION ALL
SELECT 0.5 UNION ALL
    SELECT 0.1

SELECT 
    * 
FROM #DataToBeJoined AS a
INNER JOIN #Thresholds AS b ON a.Value >= b.Threshold
详情如下:

Value   Id  Threshold
0.1     1   0.076923
0.25    1   0.076923
0.25    2   0.153846
0.25    3   0.230769
0.5     1   0.076923
0.5     2   0.153846
0.5     3   0.230769
0.5     4   0.307692
0.5     5   0.384615
0.5     6   0.461538
 Value  Id  Threshold
    0.1     1   0.076923
    0.25    3   0.230769
    0.5     6   0.461538
0.5     6   0.461538
我感兴趣的是只返回最接近的匹配项,如下所示:

Value   Id  Threshold
0.1     1   0.076923
0.25    1   0.076923
0.25    2   0.153846
0.25    3   0.230769
0.5     1   0.076923
0.5     2   0.153846
0.5     3   0.230769
0.5     4   0.307692
0.5     5   0.384615
0.5     6   0.461538
 Value  Id  Threshold
    0.1     1   0.076923
    0.25    3   0.230769
    0.5     6   0.461538
0.5     6   0.461538
有什么想法吗

附言:

找到了这个初步解决方案:

select *, 
   (select top 1 Threshold 
    from #Thresholds 
    where #Thresholds.Threshold >= t.Value
    order by ABS(t.Value - #Thresholds.Threshold)  desc) as Threshold
from #DataToBeJoined t

我想这会得到你想要的,至少我的问题的答案符合预期

SELECT Value, Id, Threshold FROM (
  SELECT *, ROW_NUMBER() 
    OVER (PARTITION BY Value ORDER BY ABS(Value - Threshold)) as rn
  FROM #DataToBeJoined AS a
  CROSS JOIN #Thresholds AS b
) as subselect
WHERE rn = 1

若你们按升序插入阈值,那个么你们可以稍微缩短一点

select #DataToBeJoined.value,  max(#Thresholds.ID), max(#Thresholds.Threshold)
  from #DataToBeJoined
  join #Thresholds 
    on #Thresholds.value <= #DataToBeJoined.Value
 group by #DataToBeJoined.value  
如果不正常

select * 
from
(
select #DataToBeJoined.value,  #Thresholds.ID, #Thresholds.Threshold 
     , row_number() over (partition by #DataToBeJoined.value order by #Thresholds.Threshold desc) as rn
  from #DataToBeJoined
  join #Thresholds 
    on #Thresholds.value <= #DataToBeJoined.Value
) st 
where st.rn = 1

这很简单,按值顺序按阈值描述的分区上的行数为rn,,,,,其中rn=1,请给出答案。我想我也找到了一个解决方案…你想要上面或下面最接近的匹配吗?如果上面或下面最接近,那么你的示例输出和初步解决方案是不正确的。但问题是,如果我添加另一行,这看起来很有希望,但不起作用:选择0.5并集,所以即使我输入4行,结果也会返回3行…Jonny-我有调整了我的解决方案,似乎对我有效!使用ABSValue-Threshold似乎可以达到目的。谢谢你给我指明了正确的方向!对不起,“如果按升序输入阈值”是什么意思?我一直认为基于集合的方法在使用order by之前不知道顺序。如果按升序输入阈值,哪部分不清楚?插入值不是基于集合的操作。您的插入按升序排列。您测试过解决方案了吗?是,但不起作用-抱歉。即使您在SQL server中按顺序插入某些内容,它也意味着任何内容,这就是为什么我对您的查询感到困惑的原因。您真的认为这些标识不符合插入顺序吗?你认为maxThresholds.ID和maxThresholds.Threshold是神奇的吗?我可以翻出讨论这一点的书-抱歉,目前找不到任何东西来解释我的意思。身份,我没有使用,只是一个数字,但它并不意味着SQL内部存储它的顺序这是我想说的。。。无论如何,这是一个遥远的主题,并没有真正帮助任何人。