假设我有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/