Jen s trochou snahy. Něco jako toto:
select listagg((case when running_len < 4000 then oi.impression end), ',') within group (order by oi.line)
from (select oi.*,
sum(length(oi.impression) + 1) over (partition by ?? order by oi.line) as running_len
from order_impression oi
) oi
group by ??;
Tím se vypočítá průběžná délka a agregují se pouze hodnoty, které délku nepřesahují. ??
je cokoliv, co používáte pro agregaci. To předpokládá, že line
je jedinečný, takže order by
je stabilní.
Toto nebude zahrnovat impression
která přesahuje délku -- a po tom nic. Neubere to dojem. Tato logika je možná, ale komplikuje dotaz.