Мне кажется, я понимаю вашу проблему.Я создал таблицу с именем professions
с вашими значениями и таблицу map_vals
с поисковыми значениями.Затем я придумал это:
select p.range as `range1`, p.profession, v.value from professions p
inner join map_vals v ON v.value >= p.range
where p.range =
(select max(p3.range) from professions p3 where p3.range <= v.value)
order by v.value
, которое при задании этих значений ...
value
29
0
60
1
23
54
возвращает
range1 profession value
0 Office Worker 0
0 Office Worker 1
23 Construction 23
23 Construction 29
54 Medical 54
54 Medical 60
РЕДАКТИРОВАТЬ:
Вы также можете использовать CROSS APPLY, как показано manfred-sorg , но для этого требуется ORDER BY DESC
, или вы получите следующее:
select v.Value, p.Profession
from tblValues v
cross apply
(select top(1) pr.Profession
from tblProfessionRanges pr
where pr.Range <= v.Value) p
производит
Value Profession
----------- --------------------------------------------------
29 Office Worker
1 Office Worker
60 Office Worker
, чтобы получить желаемый результат, вам нужно изменить его на:
select v.Value, p.Profession
from tblValues v
cross apply
(select top(1) pr.Profession
from tblProfessionRanges pr
where pr.Range <= v.Value ORDER BY pr.[Range] DESC) p
Value Profession
----------- --------------------------------------------------
29 Construction
1 Office Worker
60 Medical
Однако требуемая сортировка делает его менее эффективным, чем использование MAX
.