首页 > 解决方案 > 使用 postgresql 随机排序时的确定性顺序

问题描述

我正在使用如下查询:

SELECT * FROM items ORDER BY RANDOM()

如果行数很少,一切都很好。然而,在我的测试中,我希望有一些可重现的东西来验证。这就是我播种随机数生成器的原因:

SELECT setseed(0.123);
SELECT * FROM items ORDER BY RANDOM();

这很好,工作得很好。看起来每次执行的顺序都是相同的。除了它不是完全可重现的。在某些情况下,测试成功并且我得到了预期的顺序和结果。在同一测试的某些执行中,我没有。这是为什么?

标签: sqlpostgresqlselectrandomsql-order-by

解决方案


问题与以下事实有关:首先以未指定的顺序获取行(如果未指定 ORDER BY 子句),然后才为每行调用 RANDOM() 函数。这意味着在应用 ORDER BY RANDOM() 之后,未指定的顺序将影响行顺序。

例如,在两种情况下都使用相同的种子:

情况1

SELECT * FROM items
returns
item_1
item_2
item_3
item_4

SELECT * FROM items ORDER BY RANDOM();
may return

item_3
item_4
item_1
item_2

案例2

SELECT * FROM items
returns
item_4
item_3
item_2
item_1

SELECT * FROM items ORDER BY RANDOM();
may return

item_2
item_1
item_4
item_3

然后解决方案是在通过 RANDOM() 对行进行排序之前对行进行排序。最终结果是 100% 确定的。


推荐阅读