這是一個開始。這將有表現不佳:
declare @Qs table (QuestionID int not null, QuestionMarks int not null)
insert into @Qs (QuestionID,QuestionMarks) values
(1,1), (2,4), (5,1), (9,1), (12,2)
declare @TargetMarks int = 8
declare @TargetCount int = 4
;with Build as (
select QuestionID as MinID,QuestionID as MaxID,QuestionMarks as Total,1 as Cnt
,'/' + CONVERT(varchar(max),QuestionID) + '/' as QPath
from @Qs
union all
select MinID,q.QuestionID,Total+q.QuestionMarks,Cnt+1,QPath + CONVERT(varchar(max),q.QuestionID) + '/'
from
Build b
inner join
@Qs q
on
b.MaxID < q.QuestionID and
b.Total + q.QuestionMarks <= @TargetMarks and
b.Cnt < @TargetCount
)
select * from Build where Cnt = @TargetCount and Total = @TargetMarks
結果集:
MinID MaxID Total Cnt QPath
--------------------------------------------------------------------------------
2 12 8 4 /2/5/9/12/
1 12 8 4 /1/2/9/12/
1 12 8 4 /1/2/5/12/
棘手的部分是,QPath值是不完全存儲ID值最大的方式。
要麼我計算錯誤,要麼你的樣本和評論不匹配(我在你的樣本中共有8個標記)。另外,無論你如何切片,我認爲這是一次組合爆炸。 – 2012-07-08 05:14:03
對不起,這是我的錯誤與QuestionID = 12的最後一個問題是標記2,現在編輯 – 2012-07-08 05:16:54
@Damien_The_Unbeliever - 所以沒有安全的方式來在SQL中執行它? – 2012-07-08 05:18:54