Ако разбирам правилно, в agg има безброй комбинации [(id1; 10), (id1, id2; 10+20)...] и от там избираме нужните с INNER JOIN накрая? Само че изпълнението на заявката не спира, дори с 10 packages & 5 vehicles.
От
тук измислих следното:
SQL code:
WITH RECURSIVE t AS (
SELECT
id,
weight,
row_number() OVER (ORDER BY id) seqnum
FROM package
), cte(id, weight, total_weight, ids, seqnum, grp) AS (
SELECT
id,
weight,
weight as total_weight,
t.id::text,
1 as seqnum,
1 as grp
FROM t
WHERE seqnum = 1
UNION ALL
SELECT
t.id,
t.weight,
(CASE WHEN cte.total_weight + t.weight > 150 THEN t.weight ELSE cte.total_weight + t.weight END) as total_weight,
(CASE WHEN cte.total_weight + t.weight > 150 THEN t.id::text ELSE cte.ids || ',' || t.id::text END) as ids,
t.seqnum,
(CASE WHEN cte.total_weight + t.weight > 150 THEN cte.grp + 1 ELSE cte.grp END) as grp
FROM t JOIN cte ON cte.seqnum = t.seqnum - 1
)
SELECT grp, max(ids) ids, total_weight, v.id as vid, v.max_weight
FROM cte
INNER JOIN vehicle v ON v.max_weight >= total_weight
GROUP BY grp, total_weight, vid
ORDER BY total_weight DESC;
Това дава кои packages могат да се натоварят в кой vehicle, но тук max_weight е статичен - 150 и не може да се вземе от vehicle.

Ако се махнат CASE WHEN и се оставят само сумите, то тогава резултата е само 1; 1,2; 1,2,3;... и съответните total_weights. А трябва да е 1,2,3; 4,5,6,7; 8,9.