sqlite - 如何根据整数值的概率选择行?

时间:2018-05-25 18:27:31

标签: python sqlite probability

在我的数据库中,我有一个乐队列表以及一个流行度列,当用户在网页上分别按下喜欢或不喜欢按钮时,它会递增或递减。我想根据这个受欢迎的专栏选择乐队。选择一个波段的概率取决于这个流行度列,它是一个整数值,而不是一个十进制值,如0.3,0.1,如果一个人在处理概率,这应该是有意义的,但在我的情况下,我不认为这是可能的。我的表格示例:

Bands        probability
Led Zeppelin    79
Megadeth         4
Queen           37
Aerosmith       20
Guns N Roses   103

基于此,Guns N'Roses应该被选中的机会最高,而Megadeth被选中的机会最低,而其他乐队也有自己被选中的机会。我将从2000年的名单中选出10个乐队。

2 个答案:

答案 0 :(得分:2)

首先,计算每个频段的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还没有窗口函数,在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;

根据需要重复,忽略重复。

答案 1 :(得分:-1)

如果我正确理解您的问题和问题,您想要选择具有最高人气/概率值的10个频段吗?

在SQL中你可以做到:

选择* FROM table_name ORDER BY流行度DESC LIMIT 10

这将选择表格中的所有列,按降序排列按降序排列(从最大到最小),并在前10个条目后停止。

相关问题