2014-12-06 89 views

回答

1

考慮第一個表達式:

select (case when round(random()*999999) + 1 between 000001 and 400000 then 1 
      when round(random()*999999) + 1 between 400001 and 999998 then 2 
      when round(random()*999999) + 1 between 999999 and 999999 then 3 
      else 4 
     end) 
from generate_series(1, 8000000) 

想必,你認爲值「4」應該幾乎從來沒有被選中。但是,問題是random()正在分別爲每個when子句調用。

所以,機會就失敗每個子句獨立:

  • 大約60%的時間的隨機數不匹配「1」。
  • 約40%的隨機數字不匹配「2」。
  • 大約99.9999%的隨機數字不匹配的時間「3」(如果9的數量已關閉,但實際值爲1,我表示歉意)。

這意味着約24%的時間(60%* 40%* 99.9999%),值「4」將出現。實際上,第一個查詢返回「4」23.98%的時間。說實話,這與實際價值非常接近,但考慮到這個數據的大小,但它比我預期的要稍微偏離一點。但是,它足以解釋發生了什麼。