इसे हल करने के लिए आप MSSQL में पुनरावर्ती क्वेरी का उपयोग कर सकते हैं।
पहली पुनरावर्ती क्वेरी संचयी योग <=150 के साथ वस्तुओं का एक पेड़ बनाती है। दूसरी पुनरावर्ती क्वेरी संचयी योग =150 के साथ लीफ लेती है और ऐसे सभी पथों को इसकी जड़ों तक आउटपुट करती है। साथ ही ItemsCount
. द्वारा क्रमित अंतिम परिणामों में इसलिए आपको पहले पसंदीदा समूह मिलेंगे (कम से कम आइटम गिनती के साथ)।
WITH CTE as
( SELECT id,num,
id as Grp,
0 as parent,
num as CSum,
1 as cnt,
CAST(id as Varchar(MAX)) as path
from T where num<=150
UNION all
SELECT t.id,t.num,
CTE.Grp as Grp,
CTE.id as parent,
T.num+CTE.CSum as CSum,
CTE.cnt+1 as cnt,
CTE.path+','+CAST(t.id as Varchar(MAX)) as path
from T
JOIN CTE on T.num+CTE.CSum<=150
and CTE.id<T.id
),
BACK_CTE as
(select CTE.id,CTE.num,CTE.grp,
CTE.path ,CTE.cnt as cnt,
CTE.parent,CSum
from CTE where CTE.CSum=150
union all
select CTE.id,CTE.num,CTE.grp,
BACK_CTE.path,BACK_CTE.cnt,
CTE.parent,CTE.CSum
from CTE
JOIN BACK_CTE on CTE.id=BACK_CTE.parent
and CTE.Grp=BACK_CTE.Grp
and BACK_CTE.CSum-BACK_CTE.num=CTE.CSum
)
select id,NUM,path, cnt as ItemsCount from BACK_CTE order by cnt,path,Id