थोड़े से प्रयास से ही। कुछ इस तरह:
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 ??;
यह चलने की लंबाई की गणना करता है और केवल उन मानों को एकत्रित करता है जो लंबाई से अधिक नहीं होते हैं। ??
जो कुछ भी आप एकत्रीकरण के लिए उपयोग कर रहे हैं। यह मान लेता है कि line
अद्वितीय है, इसलिए order by
स्थिर है।
इसमें impression
. शामिल नहीं होगा जो लंबाई से अधिक है -- और उसके बाद कुछ भी नहीं। यह छाप को नहीं काटता है। वह तर्क संभव है, लेकिन यह क्वेरी को जटिल बनाता है।