mysql随机抽样方法_MySQL中随机抽样
mysql随机抽样⽅法_MySQL中随机抽样
2.9 随机抽样
在审计或IT审计中,常常使⽤抽样,也就是对具有审计相关性的总体中低于百分之百的项⽬实施审计程序,使所有抽样单元都有被选取的机会,为注册会计师针对整个总体得出结论提供合理基础。简单来说,就是我们需要从总体中选出⼀些样本,通过对样本的检查,得出结论,再推导出总体的结论。
在Excel中或⼀些软件中,我们可以⾮常容易在数据中抽样,但当数据量超过Excel表最⼤限制时或数据很⼤时,我们需要在数据库中处理,那么如何⽤SQL抽样,就是我们应该掌握的。本节我们介绍随机抽样的三种⽅法,数据仍采⽤2.6节中APP数据集⾥AppleStore表作为讲解⽰例。⾸先,我们通过
select count(*) from AppleStore
求出表中有7142条数据,假设我们需要随机抽样出100条数据。
如何洗葡萄「⽅法⼀」
select * from AppleStoreorder by rand()limit 100;
解释:
rand()
函数会产⽣0-1之间的随机数,
打新冠疫苗前后要注意什么
order by rand()
根据产⽣的随机数进⾏排序。
limit 100
截取前100⾏数据。从⽽达到随机抽样100条数据的⽬的。当然如果需要抽样出N条数据就使⽤
limit N
。即:
select * from 表名order by rand()limit N;
需要注意的是,虽然这是最简单的⽅法,并且在数据较⼩的表执⾏速度较快,但是当数据较⼤的时候,查询速度就会较慢。
一立方米等于多少吨「⽅法⼆」
我们先计算我们需要抽样数据与总体的占⽐
100/7142=0.014
,然后通过查询语句随机抽样出上述⽐例的数据:
select * from AppleStorewhere rand()<0.014
解释:对于每⼀⾏数据,都会执⾏判断条件
where rand()<0.014倚怎么读
,⽽
rand()
是产⽣0-1的随机函数,那么每条数据都有0.014的机率被筛选出来,最终会筛选出
总体×0.014
条数据。当然实际筛选出的数据条数不是固定的,它随着数据量越⼤越接近0.014这个⽐例。我们为了抽取出刚好100条数据,我们可以稍微提⾼抽取的⽐例,然后使⽤
limit 100
截取前100条数据:
33朵玫瑰代表什么意思select * from AppleStorewhere rand()<0.015limit 100;
「⽅法三」
本⽅法需要表中有⼀列是连续编号的数字,⼀般的表中id或序号都是连续编号的,我们可以直接使⽤。如果没有连续编号的列,那么我们需要⼈为的创建⼀列序号数据。在AppleStore中⽆论是id还是序号都是不连续的,所以我们⾸先新增⼀列,列名为‘num’。
教师节语录新增列语法:
alter table 表名 add column 列名 数据类型;
⽐如,给AppleStore新增⼀列num,数据类型为int:
alter table AppleStore add column num int;
删除列语法:
alter table 表名 drop column 列名;
修改列名语法:
alter table 表名 change 原列名 新列名 数据类型;
以上是对列操作的语句⽤法,下⾯我们给创建的num列添加连续的序号:
set @rn=0;update AppleStore set num=(@rn:=@rn+1);
解释:在SQL中命名⼀个变量需要在前⾯加⼀个@符号,这⾥我们命名⼀个代表⾏数的变量
@rn
(row number)。
update 表名 set 列名=值 where 列名=某值
是修改值的语法。这⾥我们⽤
num=(@rn:=@rn+1)
使列num的值递增增加。
需要注意的是在使⽤update语句⾥,可能会报错:Error Code 1175 You are using safe update mode。也就是如果没有加where限制条件更新值是不允许的。这⾥我们关闭安全更新模式:
SET SQL_SAFE_UPDATES = 0;
通过上述步骤,我们给原表增加了递增的连续编号列num列。我们现在就可以根据num列进⾏随机抽样。
set @max=7142;set @min=1;select *from AppleStore a join(select floor(@min+(@max-@min+1)*rand()) as numfrom AppleStorelimit 100) b on a.num=b.numlimit 100;
解释:我们将num列的最⼤编号、最⼩编号分别命名为变量@max和@min。
select floor(@min+(@max-@min+1)*rand()) as numfrom AppleStorelimit 100
该⼦句的作⽤是随机⽣成100个num序号。其中
floor()
函数是对⼀个数向下取整,如floor(1.2)=1,这⾥采⽤向下取整,⽽不使⽤四舍五⼊的原因是防⽌抽样出的数据超过序号的最⼤值。该⼦句查询结果,我们重命名为表b,将表a,表b通过序号内连接,查出b表中随机抽样出的100个序号所对应的数据。可以看出我们对序号的要求并不需要从1开始,它可以从任意值开始,只要序号是连续的。本⽅法在数据量⼤的情况下也有较快的查询速度。
上⾯我们添加num列是直接在原表上添加列并⽣成递增连续编号,很多时候修改原数据表是不妥的,可以使⽤
with as
将新增num列后的查询表结果作为可以被引⽤的⽚断。
select *,row_number() over (order by id) as numfrom AppleStore
row_number() over (order by id) as num
,row_number函数将原表数据按id排序后⽣成序号,重命名为num。该查询语句实际就是在原AppleStore表基础上增加了列num,只是序号只显⽰在查询结果中,⽽不是对原表进⾏修改。我们利⽤
with as
将AppleStore⽤增加的num列来替换。
set @max=7142;set @min=1;with AppleStore as (select *,row_number() over (order by id) as numfrom AppleStore)select
*from AppleStore a join(select floor(@min+(@max-@min+1)*rand()) as numfrom AppleStorelimit 100) b on
a.num=
b.numlimit 100;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。