sql - 以加权机会从数据库中提取项目

标签 sql database temp-tables

假设我有一个充满记录的表,我想从中提取随机记录。但是,我希望该表中的某些行比其他行更频繁地出现(并且哪些行因用户而异)。使用 SQL 解决此问题的最佳方法是什么?

我能想到的唯一方法是创建一个临时表,用我想要更常见的行填充它,然后用从表中随机选择的其他行填充它。有没有更好的办法?

最佳答案

我能想到的一种方法是在表中创建另一列,它是你的权重的滚动总和,然后通过生成一个介于 0 和所有权重总和之间的随机数来提取你的记录,并使用小于随机数的最高滚动总和值。

例如,如果您有四个具有以下权重的行:

+---+--------+------------+
|row| weight | rollingsum |
+---+--------+------------+
| a |      3 |          3 |
| b |      3 |          6 |
| c |      4 |         10 |
| d |      1 |         11 |  
+---+--------+------------+

然后,选择一个随机数n介于 0 和 11 之间(含),并返回行 a如果0<=n<3 , b如果3<=n<6 , 等等。

这里有一些关于生成滚动总和的链接:

http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql.html

http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql_followup.html

关于sql - 以加权机会从数据库中提取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150652/

相关文章:

sql - 如何添加数据库限制 - 检查约束或触发器

php - 如何使用代码点火器框架在查询 php 中将动态对象转换为数组

sql - 删除临时表时如何避免删除静态表

sql - 在 MS-Access 中比较日期时数据类型不匹配

MySql 查询时间间隔数据的直方图

sql - 嵌套选择的性能

postgresql - 从 PostgreSQL 获取临时表创建语句

sql - 谷歌电子表格查询功能列ID不是列的字母

php - MySQL RAND() 不工作,总是得到相同的结果

sql - 如何在带有值和空列的postgresql中创建临时表