如何在 Postgres 中从具有非均匀分布的表中选择随机行?

Posted

技术标签:

【中文标题】如何在 Postgres 中从具有非均匀分布的表中选择随机行?【英文标题】:How to select random row from table with non-uniform distribution, in Postgres? 【发布时间】:2014-09-22 10:22:43 【问题描述】:

这就是我从均匀分布的表中选择随机行的方法。

SELECT * FROM foo OFFSET floor( random() * ( SELECT COUNT(*) FROM foo ) ) ORDER BY bar LIMIT 1;

假设我想选择一个具有非均匀分布的随机行,比如正态分布。

目前,我的做法是:

SELECT * FROM foo OFFSET floor( $1 * ( SELECT COUNT(*) FROM foo ) ) ORDER BY bar LIMIT 1;

...并在执行之前计算出$1 的值。

有没有更好的方法来做到这一点? 也许使用内置的 postgres 函数? 也许不需要内部的SELECT 声明?

【问题讨论】:

非线性分布(如正态分布)有一些元素的 P 高于其他元素。你如何决定,哪些元素有哪些 P? 什么是线性分布?您能否举例说明“选择具有非线性分布的随机行”的含义? 这里没有ORDER BY。那么......沿着什么轴分布? (一般来说,关系数据库不擅长选择随机行,或者至少 PostgreSQL 是这样)。 Igor, Gordon & Graig - 我省略了 ORDER by 子句,因为它与问题无关。当然,在我的实际应用程序中,我正在订购查询。我会更新问题以反映这一点。 ...话虽如此,我也不能完全确定按任何特定元素排序然后在随机索引处选择一行(其中索引具有正态分布)足以选择一个在有序属性上正态分布的随机行。如果是这样,请回答正确的方法应该是什么。 【参考方案1】:

也许这个entry from google books 会有所帮助。

我相信您正在寻找均匀/非均匀而不是线性/非线性,这可能会阻碍您的搜索。

【讨论】:

感谢您指出线性分布和均匀分布之间的区别,您说得对,我确实混淆了术语。

以上是关于如何在 Postgres 中从具有非均匀分布的表中选择随机行?的主要内容,如果未能解决你的问题,请参考以下文章

参数化:处理非均匀数据分布

如何在哈希表中均匀分布不同的键?

在 postgres 中更新具有大量删除的表的主键序列

具有超过十亿行的表的 Postgres 性能

在postgres中从末尾截断字母?

如何在 Postgres 中使用 CASE 或 IF 语句从不同的表中进行选择?