найти ближайшее нижнее и верхнее значения из столбца_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