如何在SQL中使用高效的简单随机样本?有问题的数据库正在运行MySQL; 我的表至少有200,000行,我想要一个大约10,000的简单随机样本.
"明显"的答案是:
SELECT * FROM table ORDER BY RAND() LIMIT 10000
Run Code Online (Sandbox Code Playgroud)
对于大型表来说,这太慢了:它为每一行调用RAND()(已经将它放在O(n)处)并对它们进行排序,最多使它成为O(n lg n).有没有办法比O(n)更快地做到这一点?
注意:正如Andrew Mao在评论中指出的那样,如果您在SQL Server上使用此方法,则应使用T-SQL函数NEWID(),因为RAND()可能会为所有行返回相同的值.
编辑:5年后
我用更大的表再次遇到了这个问题,并最终使用了@ ignorant的解决方案,并进行了两次调整:
要获取表的1000项样本,我计算行并使用frozen_rand列将结果平均下降到10,000行:
SELECT COUNT(*) FROM table; -- Use this to determine rand_low and rand_high
SELECT *
FROM table
WHERE frozen_rand BETWEEN %(rand_low)s AND %(rand_high)s
ORDER BY RAND() LIMIT 1000
Run Code Online (Sandbox Code Playgroud)
(我的实际实现涉及更多的工作,以确保我没有欠采样,并手动包裹rand_high,但基本的想法是"随机削减你的N到几千.")
虽然这会做出一些牺牲,但它允许我使用索引扫描对数据库进行采样,直到它再次小到ORDER BY RAND()为止.
sys和os.syspython有什么区别?我看到许多项目sys在导入时使用os.当我尝试dir(sys)并且dir(os.sys)它们具有相同的功能并且它们的输出相同时.
我经常看到代码使用sys.exit这样,而不是使用os.sys.exit,但两者都做同样的事情.
import os
import sys
sys.exit()
Run Code Online (Sandbox Code Playgroud) 我如何让我的朋友使用我的Python程序?他们没有安装python,但他们可以使用命令行程序.我没有写GUI的技巧.
让我说,我正在编写一些微积分计算器,有很多自定义模块和文件.我该如何分享?
我正在尝试修复我正在使用的富文本编辑器中的错误,这会导致<embed>插入标签而没有它们的结束标记(这会完全拧紧输出).我已将问题隔离到此操作:
// body is a <body> tag
body.innerHTML = '<embed src="http://example.com/whatever"></embed>';
Run Code Online (Sandbox Code Playgroud)
没有花哨的代码,只有Firefox的innerHTML任务.您应该能够在Firebug中复制错误,如下所示:
>>> document.body.innerHTML = "<embed></embed>"
"<embed></embed>"
>>> document.body.innerHTML
"<embed>"
Run Code Online (Sandbox Code Playgroud)
这有解决方法吗?我需要标签,但由于一个糟糕的边缘情况,我不能证明重建/替换整个富文本编辑器是正确的.
我无法将其转换为类似的东西document.createElement('embed'),因为这个编辑器的真实世界输入可以很容易地包含几段文字包裹着<embed>; 在纸面上,innerHTML非常适合这个用例,我只是无法使用它<embed>.