sqlite - 如何通过整数值根据概率 select 行?
sqlite - How to select rows based on probability via integer value?
在我的数据库中,我有一个乐队列表和一个流行度列,当用户在网页上分别按下喜欢或不喜欢按钮时,流行度列会增加或减少。我想 select 乐队基于这个人气专栏。乐队被 selected 的概率取决于这个流行度列,它是一个整数值,而不是像 0.3、0.1 这样的小数值,如果一个人正在处理概率,这应该是有意义的,但在我的例子中,我不认为这是可能的。我的例子 table:
Bands probability
Led Zeppelin 79
Megadeth 4
Queen 37
Aerosmith 20
Guns N Roses 103
据此,Guns N' Roses 被 selected 的几率应该最高,而 Megadeth 被 selected 的几率最低,而其他乐队也各有各的被 selected 的机会。我将从 2000 个列表中 selecting 10 个波段。
如果我正确理解你的问题和问题,你想 select 具有最高 popularity/probability 值的 10 个波段对吗?
在 SQL 中,您也许可以:
Select * FROM table_name 按人气排序 DESC LIMIT 10
这 select 您 table 中的所有列,按受欢迎程度降序排列(从大到小),并在前 10 个条目后停止。
首先,计算每个波段的 cumulative probability(排序顺序是任意的;您也可以使用一些 ID):
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
AS CumProb
FROM Bands
ORDER BY Band;
Band CumProb
--------------- ---------------
Aerosmith 0.0823045267489
Guns N Roses 0.5061728395061
Led Zeppelin 0.8312757201646
Megadeth 0.8477366255144
Queen 1.0
(只要 SQLite 还没有 window 函数,在 Python 中进行求和会更有效率。但是对于 2000 行,这并不重要。)
然后使用 0 到 1 之间的随机数查找其中一行(等于或大于的第一行):
WITH CPBands(Band, CumProb) AS (
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
FROM Bands
)
SELECT Band
FROM CPBands
WHERE CumProb >= ?
ORDER BY CumProb ASC
LIMIT 1;
根据需要重复多次,忽略重复项。
在我的数据库中,我有一个乐队列表和一个流行度列,当用户在网页上分别按下喜欢或不喜欢按钮时,流行度列会增加或减少。我想 select 乐队基于这个人气专栏。乐队被 selected 的概率取决于这个流行度列,它是一个整数值,而不是像 0.3、0.1 这样的小数值,如果一个人正在处理概率,这应该是有意义的,但在我的例子中,我不认为这是可能的。我的例子 table:
Bands probability
Led Zeppelin 79
Megadeth 4
Queen 37
Aerosmith 20
Guns N Roses 103
据此,Guns N' Roses 被 selected 的几率应该最高,而 Megadeth 被 selected 的几率最低,而其他乐队也各有各的被 selected 的机会。我将从 2000 个列表中 selecting 10 个波段。
如果我正确理解你的问题和问题,你想 select 具有最高 popularity/probability 值的 10 个波段对吗?
在 SQL 中,您也许可以:
Select * FROM table_name 按人气排序 DESC LIMIT 10
这 select 您 table 中的所有列,按受欢迎程度降序排列(从大到小),并在前 10 个条目后停止。
首先,计算每个波段的 cumulative probability(排序顺序是任意的;您也可以使用一些 ID):
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
AS CumProb
FROM Bands
ORDER BY Band;
Band CumProb
--------------- ---------------
Aerosmith 0.0823045267489
Guns N Roses 0.5061728395061
Led Zeppelin 0.8312757201646
Megadeth 0.8477366255144
Queen 1.0
(只要 SQLite 还没有 window 函数,在 Python 中进行求和会更有效率。但是对于 2000 行,这并不重要。)
然后使用 0 到 1 之间的随机数查找其中一行(等于或大于的第一行):
WITH CPBands(Band, CumProb) AS (
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
FROM Bands
)
SELECT Band
FROM CPBands
WHERE CumProb >= ?
ORDER BY CumProb ASC
LIMIT 1;
根据需要重复多次,忽略重复项。