sql随机抽取数据50条_MySQL中随机抽样
2.9 隨機(jī)抽樣
在審計(jì)或IT審計(jì)中,常常使用抽樣,也就是對(duì)具有審計(jì)相關(guān)性的總體中低于百分之百的項(xiàng)目實(shí)施審計(jì)程序,使所有抽樣單元都有被選取的機(jī)會(huì),為注冊(cè)會(huì)計(jì)師針對(duì)整個(gè)總體得出結(jié)論提供合理基礎(chǔ)。簡(jiǎn)單來(lái)說(shuō),就是我們需要從總體中選出一些樣本,通過(guò)對(duì)樣本的檢查,得出結(jié)論,再推導(dǎo)出總體的結(jié)論。
在Excel中或一些軟件中,我們可以非常容易在數(shù)據(jù)中抽樣,但當(dāng)數(shù)據(jù)量超過(guò)Excel表最大限制時(shí)或數(shù)據(jù)很大時(shí),我們需要在數(shù)據(jù)庫(kù)中處理,那么如何用SQL抽樣,就是我們應(yīng)該掌握的。本節(jié)我們介紹隨機(jī)抽樣的三種方法,數(shù)據(jù)仍采用2.6節(jié)中APP數(shù)據(jù)集里AppleStore表作為講解示例。首先,我們通過(guò)select count(*) from AppleStore求出表中有7142條數(shù)據(jù),假設(shè)我們需要隨機(jī)抽樣出100條數(shù)據(jù)。
「方法一」
select * from AppleStoreorder by rand()limit 100;解釋:rand()函數(shù)會(huì)產(chǎn)生0-1之間的隨機(jī)數(shù),order by rand()根據(jù)產(chǎn)生的隨機(jī)數(shù)進(jìn)行排序。limit 100截取前100行數(shù)據(jù)。從而達(dá)到隨機(jī)抽樣100條數(shù)據(jù)的目的。當(dāng)然如果需要抽樣出N條數(shù)據(jù)就使用limit N。即:
select * from 表名order by rand()limit N;需要注意的是,雖然這是最簡(jiǎn)單的方法,并且在數(shù)據(jù)較小的表執(zhí)行速度較快,但是當(dāng)數(shù)據(jù)較大的時(shí)候,查詢速度就會(huì)較慢。
「方法二」
我們先計(jì)算我們需要抽樣數(shù)據(jù)與總體的占比100/7142=0.014,然后通過(guò)查詢語(yǔ)句隨機(jī)抽樣出上述比例的數(shù)據(jù):
select * from AppleStorewhere rand()<0.014解釋:對(duì)于每一行數(shù)據(jù),都會(huì)執(zhí)行判斷條件where rand()<0.014,而rand()是產(chǎn)生0-1的隨機(jī)函數(shù),那么每條數(shù)據(jù)都有0.014的機(jī)率被篩選出來(lái),最終會(huì)篩選出總體×0.014條數(shù)據(jù)。當(dāng)然實(shí)際篩選出的數(shù)據(jù)條數(shù)不是固定的,它隨著數(shù)據(jù)量越大越接近0.014這個(gè)比例。我們?yōu)榱顺槿〕鰟偤?00條數(shù)據(jù),我們可以稍微提高抽取的比例,然后使用limit 100截取前100條數(shù)據(jù):
select * from AppleStorewhere rand()<0.015limit 100;「方法三」
本方法需要表中有一列是連續(xù)編號(hào)的數(shù)字,一般的表中id或序號(hào)都是連續(xù)編號(hào)的,我們可以直接使用。如果沒(méi)有連續(xù)編號(hào)的列,那么我們需要人為的創(chuàng)建一列序號(hào)數(shù)據(jù)。在AppleStore中無(wú)論是id還是序號(hào)都是不連續(xù)的,所以我們首先新增一列,列名為‘num’。
新增列語(yǔ)法:
alter table 表名 add column 列名 數(shù)據(jù)類型;比如,給AppleStore新增一列num,數(shù)據(jù)類型為int:
alter table AppleStore add column num int;刪除列語(yǔ)法:
alter table 表名 drop column 列名;修改列名語(yǔ)法:
alter table 表名 change 原列名 新列名 數(shù)據(jù)類型;以上是對(duì)列操作的語(yǔ)句用法,下面我們給創(chuàng)建的num列添加連續(xù)的序號(hào):
set @rn=0;update AppleStore set num=(@rn:=@rn+1);解釋:在SQL中命名一個(gè)變量需要在前面加一個(gè)@符號(hào),這里我們命名一個(gè)代表行數(shù)的變量@rn(row number)。update 表名 set 列名=值 where 列名=某值是修改值的語(yǔ)法。這里我們用num=(@rn:=@rn+1)使列num的值遞增增加。
需要注意的是在使用update語(yǔ)句里,可能會(huì)報(bào)錯(cuò):Error Code 1175 You are using safe update mode。也就是如果沒(méi)有加where限制條件更新值是不允許的。這里我們關(guān)閉安全更新模式:
SET SQL_SAFE_UPDATES = 0;通過(guò)上述步驟,我們給原表增加了遞增的連續(xù)編號(hào)列num列。我們現(xiàn)在就可以根據(jù)num列進(jìn)行隨機(jī)抽樣。
set @max=7142;set @min=1;select * from AppleStore a join (select floor(@min+(@max-@min+1)*rand()) as num from AppleStore limit 100) b on a.num=b.numlimit 100;解釋:我們將num列的最大編號(hào)、最小編號(hào)分別命名為變量@max和@min。
select floor(@min+(@max-@min+1)*rand()) as numfrom AppleStorelimit 100該子句的作用是隨機(jī)生成100個(gè)num序號(hào)。其中floor()函數(shù)是對(duì)一個(gè)數(shù)向下取整,如floor(1.2)=1,這里采用向下取整,而不使用四舍五入的原因是防止抽樣出的數(shù)據(jù)超過(guò)序號(hào)的最大值。該子句查詢結(jié)果,我們重命名為表b,將表a,表b通過(guò)序號(hào)內(nèi)連接,查找出b表中隨機(jī)抽樣出的100個(gè)序號(hào)所對(duì)應(yīng)的數(shù)據(jù)。可以看出我們對(duì)序號(hào)的要求并不需要從1開(kāi)始,它可以從任意值開(kāi)始,只要序號(hào)是連續(xù)的。本方法在數(shù)據(jù)量大的情況下也有較快的查詢速度。
上面我們添加num列是直接在原表上添加列并生成遞增連續(xù)編號(hào),很多時(shí)候修改原數(shù)據(jù)表是不妥的,可以使用with as將新增num列后的查詢表結(jié)果作為可以被引用的片斷。
select *,row_number() over (order by id) as numfrom AppleStorerow_number() over (order by id) as num,row_number函數(shù)將原表數(shù)據(jù)按id排序后生成序號(hào),重命名為num。該查詢語(yǔ)句實(shí)際就是在原AppleStore表基礎(chǔ)上增加了列num,只是序號(hào)只顯示在查詢結(jié)果中,而不是對(duì)原表進(jìn)行修改。我們利用with as將AppleStore用增加的num列來(lái)替換。
set @max=7142;set @min=1;with AppleStore as (select *,row_number() over (order by id) as num from AppleStore)select * from AppleStore a join (select floor(@min+(@max-@min+1)*rand()) as num from AppleStore limit 100) b on a.num=b.numlimit 100;青藤數(shù)據(jù)-審計(jì)師自己的平臺(tái)
總結(jié)
以上是生活随笔為你收集整理的sql随机抽取数据50条_MySQL中随机抽样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 260. 只出现一次的
- 下一篇: linux cmake编译源码,linu