mysql-->随机取数
该笔记记录缘由:客户要求分析21年3月每天用户消费的高峰时间点,每天随机取50条数据进行分析,总结出3种随机取数的方法,详情如下
方法一
1)使用rand()随机取数,适用于数据量少的情况,若查询表数量大会非常耗时(测试效果建下图一)
-- 写法一SELECT *from `结账单` ORDER BY RAND() LIMIT 50;-- 写法二(增加一列自增id列,随机取数的效果看起来更直观)SELECT *from (SELECT (@i:=@i+1) id,a1.*from `结账单` a1,(SELECT @i:=0) as i) qORDER BY RAND() LIMIT 50;
图一(数据量多少的耗时对比):
图二(方式一查询时间):
方法二(适用于数据多的情况)
思路:
1)新增某个随机数字段,取大于等于这个随机数的连续取数50条
2)使用round() * rand() 构建一个随机数
-- round(x,d):四舍五入函数;x指要处理的数,d是指保留几位小数
-- round(x),等于round(x,0),该写法默认d为0
-- RAND():函数用于返回范围0 <= V <1.0的随机浮点值V
图三(方式二查询时间):
SELECT * FROM `结账单` AS a1JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `结账单` )) AS id ) AS a2 WHERE a1.id >= a2.id ORDER BY a1.id ASC LIMIT 50;
方法三
思路:
1)利用id字段随机构建数值,取大于等于这个随机数的连续取数50条
2)使用FLOOR(MAX(id)) * RAND()构建一个随机数
-- FLOOR(x):向下取整,返回小于 x 的最大整数值;例如FLOOR(3.5)取整为3
-- MAX(x):返回指定列最大值;例如:id列(1,5,10)返回10
-- RAND():用于返回范围0 <= V <1.0的随机浮点值V
SELECT *FROM `结账单`WHERE id >= (SELECT FLOOR(MAX(id)) * RAND() FROM `结账单`)ORDER BY id LIMIT 50;-- FLOOR(x):向下取整,返回小于 x 的最大整数值;例如FLOOR(3.5)取整为3-- MAX(x):返回指定列最大值;例如:id列(1,5,10)返回10-- RAND():用于返回范围0 <= V <1.0的随机浮点值V
图四(方式三查询时间):
来源地址:https://blog.csdn.net/weixin_73361196/article/details/129549060
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341