【发布时间】:2015-02-27 04:27:26
【问题描述】:
以下代码返回多个匹配项:
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
有什么想法吗?
PS:
找到了这个初步解决方案:
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
【问题讨论】:
-
很简单,row_number() over (partition by value order by threshold desc) as rn ,,,,,, where rn = 1
-
谢谢请回复。我想我也找到了解决方案...
-
你想要最接近的匹配是在上面还是下面?
-
如果在上面或下面最接近,那么您的示例输出和初步解决方案不正确。
标签: tsql sql-server-2014