假设我有10000个预订客户资料。
这些配置文件具有以下变量:
持续时间(假期天数)
目的地(可能是巴西)
人数(多少人)
起飞(他们想离开的日期)
我想通过一个定价的预订引擎传递其中的1000个(10%),但要开发一个独立的洞察分析,我必须(尽我所能)平均分配配置文件的特征。例如,如果所有的个人资料都有3种人的数量(1、2和3),最终我希望在10%的33%范围内选择人的数量=1、33、33%的人的数量=2和33、33%的人的数量=3。
但是。。。
由于配置文件集的分布不均匀(例如,70%的配置文件由People_amount=1组成),我无法找出如何找到/创建一种循环(或其他什么东西),以填充该特征中所有类型的SELECT,直到ll 1耗尽,并与其他更进一步。
或许可以举个例子来说明我想如何填写10%的10公里个人资料样本:

Profile_id  People_amount                                     Profile_id  People_amount
1           1                                                           1           1
2           1                                                           5           2
3           1                                                           8           3
4           1       --> Filling the sample by even distribution         2           1
5           2       of available profile characteristics                6           2
6           2                                                           9           3
7           2                                                           3           1
8           3                                                           7           2
9           3                                                           4           1

希望你能帮忙!

最佳答案

您可以使用union来限制每个子选择:

(SELECT * FROM profiles WHERE People_amount=1 LIMIT 333)
UNION
(SELECT * FROM profiles WHERE People_amount=2 LIMIT 333)
UNION
(SELECT * FROM profiles WHERE People_amount=3 LIMIT 333)

括号用于将LIMIT应用于每个子选择。
更有活力的方法
如果不知道people_amount的可能值的数目,则上述方法不可行。然后我将提出一个查询,其中ORDER BY子句根据出现次数分布people_amount值。它不会给出完全相等的分布,但不同的值在结果集中具有可比性:
select     p.*
from       (
            select   people_amount,
                     count(*) as occurrences
            from     profiles
            group by people_amount) as stats
inner join profiles p
        on p.people_amount = stats.people_amount
order by   rand() * stats.occurrences
limit      1000

SQL fiddle(如果未过载)。
如果要将其扩展到其他列,如Destination,可以执行以下操作:
select     p.*
from       (
            select   people_amount,
                     destination,
                     count(*) as occurrences
            from     profiles
            group by people_amount,
                     destination) as stats
inner join profiles p
        on p.people_amount = stats.people_amount
       and p.destination = stats.destination
order by   rand() * stats.occurrences
limit      1000

其思想是,出现次数较低的值将按值的顺序排列较低,因此将在结果集的开头更频繁地弹出,以补偿其低频率。

关于mysql - MySql:在不均匀分布的数据上均匀分布的样本大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36070025/

10-16 01:35