我有一个包含三个字段的表:ID、值、计数

ID 和 Value 组成了 PK。

给定一个 ID,我想选择一个由 Count 加权的值,然后将计数减一。

所以如果我有

1  A  2
1  B  3

我应该有 2/5 的机会得到 A,3/5 的机会得到 B。
如果选择 A,则表格应如下所示
1  A  1
1  B  3

下次 A 将有 1/4 的机会被选中,而 B 将有 3/4

想法?

谢谢!

更新:

重量就像放入袋子中的具有该值(value)的筹码数量。然后随机选择一个。

最佳答案

CREATE TABLE #Vals
(
ID INT,
Value CHAR(1),
[Count] INT,
PRIMARY KEY(ID,Value)
)

INSERT INTO #Vals
SELECT 1,'A',2 UNION ALL
SELECT 1,'B',3

;WITH Nums AS
(
SELECT number
FROM master..spt_values
WHERE number>0 AND type='P'
), Row AS
(
SELECT TOP 1 v.*
FROM #Vals v
JOIN Nums n ON n.number <= v.[Count]
WHERE v.ID=1
ORDER BY CHECKSUM(NEWID())
)
UPDATE Row
SET [Count] = [Count] -1
OUTPUT inserted.*


DROP TABLE #Vals

关于sql查询选择一个随机值(加权),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5811018/

10-11 02:32
查看更多