SQL隨機抽樣取數(大規模)V0 2

2021-10-11 02:31:32 字數 1374 閱讀 5008

時間緊張、不想看太多的話,請直接拉到最後——「快速隨機id方法」

一般來講,小規模資料集,sql隨機取數很好做

select

*from table_name order

by rand(

)limit line_number

但是面臨大規模資料集的時候(一般超過千萬條以上)的時候,中颱都很費勁,此時需要使用下面的語句

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的時候就隨機生成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

1and

4

仍然是轉化思想,將個數轉化為比例即可。比如在總數345678中抽取200條,轉化為抽取萬分之6即可。

SQL 隨機抽樣的總結

對於 sql 隨機抽樣我們常想到的就是 newid 但如果對於乙個在百萬 千萬甚至更大海量資料表中抽樣的話,簡單的 newid 其效能,效率就不是很理想了。所以在這裡有必要討論一下,擇優而用。long goods 是乙個百萬資料的表,ctrl l 執行以下語句 id index 是我為主鍵加的乙個非...

mR 隨機抽樣

1.問題由來 google曾經有一道非常經典的面試題 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 這道題的解法非常多,網上討論也非常熱烈。本文要討論的是...

MySQL隨機抽樣

最近由於需要大概研究了一下mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是 select from tablename order by rand limit 1。但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在...