Следующий код возвращает более одного матча:вернуть первый матч заданного порогового значения
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() над (раздел по приказу значения по порог desc) как rn ,,,,,, где rn = 1 –
Спасибо, ответьте на сообщение pls. Я думаю, что я нашел решение ... – cs0815
Вы хотите, чтобы ближайший матч был выше или ниже? – Jonny