我正在寻找以下问题的理想解决方案:我想从表中随机选择给定数量的记录。但是,抽取的样本应与由组成员资格确定的值成比例。这是一个示例:
这是我要从中选择记录的表
表1
价值;地区
31;“ region1”
24;“ region2”
57;“ region1”
58;“ region2”
12;“ region2”
34;“ region2”
...
这是确定每个区域权重的第二张表
表2
区域;大小
“ region1”; 500
“ region2”; 1000
我想从表1中获得大小为n的样本,其中(大约)记录的三分之一(500/1500)来自区域1,三分之二(1000/1500)来自区域2。我也想在mysql内解决此问题,而不使用更高级别(PHP,Python等)
到目前为止,我发现的最优雅的解决方案是:
SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.region = t2.region
ORDER BY -log(1-RAND())/t2.size LIMIT n;
我知道-log(1-RAND())/ t2.size部分会根据变量的大小(均值){cp https://en.wikipedia.org/wiki/Inverse_transform_sampling)创建一个均匀的指数随机变量,但是为什么这样做按结果变量排序是否创建具有所需分布特征的样本?
从统计意义上讲是准确的吗?也就是说,如果我抽取足够的样本,比例会收敛到三分之一和三分之二吗? 最后,对于这个问题是否有更优雅的解决方案?