sql - 使用 postgresql 随机排序时的确定性顺序
问题描述
我正在使用如下查询:
SELECT * FROM items ORDER BY RANDOM()
如果行数很少,一切都很好。然而,在我的测试中,我希望有一些可重现的东西来验证。这就是我播种随机数生成器的原因:
SELECT setseed(0.123);
SELECT * FROM items ORDER BY RANDOM();
这很好,工作得很好。看起来每次执行的顺序都是相同的。除了它不是完全可重现的。在某些情况下,测试成功并且我得到了预期的顺序和结果。在同一测试的某些执行中,我没有。这是为什么?
解决方案
问题与以下事实有关:首先以未指定的顺序获取行(如果未指定 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% 确定的。
推荐阅读
- swift - UICollectionViewCell 内带有 UITableView 的自定义单元格
- azure - 无法连接到外部 IP 上的 Kubernetes 集群
- nginx - 登录到管理员不适用于 icecast 服务器
- discord - 检查命令是否在某个通道中运行
- vba - 用于创建文件夹并将具有特定条件的文件移动到这些文件夹的 VBA 脚本
- oracle - using unique constraints to enable simpler joins
- ruby-on-rails - Rails 5.2 + ReactJS: simple rendering issue
- python - SQLAlchemy - 从表定义中删除列
- angular - 角度依赖注入 - 使用 T 的存在?
- c++ - 类与枚举类作为索引类型