У меня есть две таблицы tab_a как
SUB_ID AMOUNT
1 10
2 5
3 7
4 15
5 4
2 таблицы tab_b как
slab_number slab_start slab_end
1 12 20
2 21 25
3 26 35
slab_start всегда будет на 1 больше, чем slab_end предыдущего номера плиты
Если я наберу промежуточную сумму для tab_a, мой результат будет
select sub_id , sum(amount) OVER(ORDER BY sub_id) run_sum
from tab_a
sub_id run_sum
1 10
2 15
3 22
4 37
5 41
Мне нужно выполнить SQL-запрос, чтобы проверить, какой slab_NUMBER, если run_sum меньше первого номера slab_num, должен быть равен нулю, если run_sum больше, чем последний номер плиты, а затем пустым, за исключением строки, которая пересекает предел.
Ожидаемый результат
sub_id run_sum slab_number
1 10 0
2 15 1
3 22 2
4 37 3
5 41 NULL
Я пробовал это.
Сначала найдите текущую сумму, которая пересекает лимит e last slab_end
select min( run_sum )
from (select sub_id , sum(amount) OVER(ORDER BY sub_id) run_sum
from tab_a ) where run_sum>=35
затем используйте запрос ниже
select sub_id,
run_sum,
case
when run_sum <
(select SLAB_START from tab_b where slab_number = '1') then
0
when run_sum = 37 then
(select max(slab_number) from tab_b)
when run_sum > 37 then
NULL
else
(select slab_number
from tab_b
where run_sum between SLAB_START and slab_end)
end slab_number
from (select sub_id, sum(amount) OVER(ORDER BY sub_id) run_sum from tab_a)
есть ли другой способ улучшить.