如何在 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
的值。
SELECT
声明?
【问题讨论】:
非线性分布(如正态分布)有一些元素的 P 高于其他元素。你如何决定,哪些元素有哪些 P? 什么是线性分布?您能否举例说明“选择具有非线性分布的随机行”的含义? 这里没有ORDER BY
。那么......沿着什么轴分布? (一般来说,关系数据库不擅长选择随机行,或者至少 PostgreSQL 是这样)。
Igor, Gordon & Graig - 我省略了 ORDER by
子句,因为它与问题无关。当然,在我的实际应用程序中,我正在订购查询。我会更新问题以反映这一点。
...话虽如此,我也不能完全确定按任何特定元素排序然后在随机索引处选择一行(其中索引具有正态分布)足以选择一个在有序属性上正态分布的随机行。如果是这样,请回答正确的方法应该是什么。
【参考方案1】:
也许这个entry from google books 会有所帮助。
我相信您正在寻找均匀/非均匀而不是线性/非线性,这可能会阻碍您的搜索。
【讨论】:
感谢您指出线性分布和均匀分布之间的区别,您说得对,我确实混淆了术语。以上是关于如何在 Postgres 中从具有非均匀分布的表中选择随机行?的主要内容,如果未能解决你的问题,请参考以下文章