从具有加权行概率的PostgreSQL表中选择随机行

栏目: 数据库 · PostgreSQL · 发布时间: 8年前

内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/13040246/select-random-row-from-a-postgresql-table-with-weighted-row-probabilities

示例输入:

SELECT * FROM test;
 id | percent   
----+----------
  1 | 50 
  2 | 35   
  3 | 15   
(3 rows)

你如何编写这样的查询,平均50%的时间我可以得到id = 1的行,35%的时间行id = 2,15%的时间行id = 3?

我尝试像SELECT id FROM测试ORDER BY p * random()DESC LIMIT 1,但它给出错误的结果. 10,000次运行后,我得到一个分布,如:{1 = 6293,2 = 3302,3 = 405},但我预计分布接近:{1 = 5000,2 = 3500,3 = 1500}.

有任何想法吗?

这应该是诀窍:

WITH CTE AS (
    SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R
)
SELECT *
FROM (
    SELECT id, SUM(percent) OVER (ORDER BY id) S, R
    FROM YOUR_TABLE CROSS JOIN CTE
) Q
WHERE S >= R
ORDER BY id
LIMIT 1;

子查询Q给出以下结果:

然后我们在范围[0,100]中简单地生成一个随机数,并选择该数字以上的第一行(WHERE子句).我们使用通用表表达式(WITH)来确保随机数仅计算一次.

BTW,SELECT SUM(percent)FROM YOUR_TABLE允许您以百分比表示任何权重 – 它们不会严格需要百分比(即加起来为100).

[SQL Fiddle]

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/13040246/select-random-row-from-a-postgresql-table-with-weighted-row-probabilities


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

引力

引力

保罗·X.麦卡锡 / 王正林 / 中信出版社 / 2018-3-1 / CNY 59.00

作者在书中提出一个全新的概念“网络引力”。我们全都受网络引力的影响,这种强大的力量正推动着数字经济前行。网络引力催生了像行星那样巨大的公司,它们以闪电般的速度击垮竞争对手,并且正在改变着商业、工作和娱乐休闲的面貌。作者在向读者展示这种令人震惊的现象的同时,还介绍了一系列独特的规则及其巨大力量,我们可以充分利用它们来创造属于自己的成功。这是在日益数字化的世界中为你赢得美好未来的一部理性指南,是一部互......一起来看看 《引力》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具