2014-12-06 46 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%的时间。说实话,这与实际价值非常接近,但考虑到这个数据的大小,但它比我预期的要稍微偏离一点。但是,它足以解释发生了什么。

相关问题