میتونید بصورت زیر عمل کنید.
برای هر رکورد احتمال تجمعی اونو حساب کنید (بر اساس فیلد Rank). بعد یک عدد رندم بین 0 و بیشترین احتمال تجمعی بزنید. در نهایت یک Select روی جدول بزنید که اولین رکوردی که دارای احتمال تجمعی بیشتر از عدد تصادفی است برگردونه.
چیزی شبیه نمونه کد زیر
Create Table TableName(
Id int,
Rank int,
Name varchar(50))
Insert TableName Values(1, 10, 'Name1')
Insert TableName Values(2, 20, 'Name2')
Insert TableName Values(3, 30, 'Name3')
Insert TableName Values(4, 40, 'Name4')
Insert TableName Values(5, 50, 'Name5')
Declare @SumRank bigint, @Rand bigint
Select @SumRank = Sum(Rank) From TableName
Set @Rand = Rand() * @SumRank
;With res (id, Rank, Name, Aptness) as(
Select Top 1
Id,
Rank,
Name,
Rank as Aptness
From TableName
Order By Id
UNION ALL
Select
t.Id,
t.Rank,
t.Name,
t.Rank + res.Aptness as Aptness
From TableName t, res
Where t.Id = res.id + 1
)
Select TOP 1 *
From res
Where Aptness> @Rand
Order by Aptness
Drop Table dbo.TebleName