найти ближайшее нижнее и верхнее значения из столбца_2 для значения из столбца_1

всем привет

допустим, у меня есть таблчками вот с таким столбцом:

value
450
638
789

и я создал таблицу с таким столбцом

block
299
399
499
599
699
799

мне нужно, чтобы выводилось ближайший нижний и верхний порог для каждого value из столбца price_block и получалось вот так:

value below_block above_block
450 399 499
638 599 699
789 699 799

как правильно построить запрос


Ответы (1 шт):

Автор решения: teran

Вариант с подзапросами

SELECT v
    ,(SELECT max(b) FROM blocks where b < v)
    ,(SELECT min(b) FROM blocks WHERE b > v)
    
FROM vals

похожий вариант с джойнами и группировкой

SELECT v, max(b1.b), min(b2.b)
FROM vals AS v
LEFT JOIN blocks AS b1 ON (b1.b < v)
LEFT JOIN blocks as b2 ON (b2.b > v)
GROUP BY v;

в зависимости от СУБД можно воспользоваться оконными функциями, например, пронумеровав значения и отобрав первые в группах

SELECT v, b1, b2
FROM  (
  SELECT v, b1.b as b1, b2.b as b2
    , row_number() over (partition by v order by b1.b DESC) as rn1
    , row_number() over (partition by v order by b2.b ASC) as rn2
  FROM vals 
  LEFT JOIN blocks as b1 ON b1.b < v
  LEFT JOIN blocks as b2 ON b2.b > v
) as t
WHERE rn1 = 1 and rn2 = 1
→ Ссылка