SQL随机抽样取数(大规模)V0.2

时间紧张、不想看太多的话,请直接拉到最后——“快速随机ID方法”

——————————————————————————————————————————————————————

小数据方法

一般来讲,小规模数据集,SQL随机取数很好做

select * from table_name order by rand() limit line_number

大规模数据集——方法1

但是面临大规模数据集的时候(一般超过千万条以上)的时候,中台都很费劲,此时需要使用下面的语句

SELECT * FROM table_name AS t1 
JOIN (
	SELECT ROUND(
		RAND() * ((SELECT MAX(id) FROM table_name)-(SELECT MIN(id) FROM table_name))
		+(SELECT MIN(id) FROM table_name)
		) AS id
	) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT the_number_that_you_want;

注意:
上面的index必须是连续的,否则抽样不均匀。

那么碰到index不连续的呢?

转化思想用起来!愉快地把未知的问题转化为上面的问题。

转化策略

第一种情况:如果没有id。
做一个连续的index出来——转化为连续id问题。

第二种情况:id不连续。
将不连续的id映射到一个连续的index上面;

第三种情况:id是否连续未知。
参考第二种情况处理。

大规模数据集——方法2——快速随机ID方法

按比例

一种 直接在生成ID的时候就随机生成ID 的思路,优于上文的思路。
这种思路是对上文的思路进行了逆转,直接生成随机的id,抽样更均匀了……,还可以自由控制抽样比例。下文举例抽取千分之四,其余的比如23/760等等,可以换算成百分比(3%)、千分比(30千分之)甚至万分比(302万分之),进行实现。

select * from 
(select *, trunc( rand(), 4 )*10000 as random from table_name 
where provincial_id=10778300 ) as tmp
where random between 1 and 4

按个数

仍然是转化思想,将个数转化为比例即可。比如在总数345678中抽取200条,转化为抽取万分之6即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值