使用子查询和RAND()随机采样给出意外的结果



编辑:如果有任何区别,我正在使用mysql 5.7.19。

我有一个表A,并且正在尝试平均随机采样行的10%。我已经决定在子查询中使用rand(),然后在随机结果上过滤会解决问题,但它给出了意外的结果。当我在过滤后打印出随机生成的值时,我会得到与主查询的" where"子句匹配的随机值,因此我想它正在再生外部选择中的随机值。

我想我错过了与子征服有关的事情以及何时执行事情,但是我真的不确定发生了什么。

谁能解释我可能做错了什么?我已经查看了这篇文章:SQL引擎执行的查询和子查询是哪个序列?,我的子查询是相关的,所以我认为我的子查询是先执行的,然后主要查询正在从中过滤。鉴于我的假设,我不明白结果为什么具有应该被过滤的值。

查询:

select 
  * 
from 
(
  select  
    *, 
    rand() as rand_value
  from    
    A
) a_rand 
where 
  rand_value < 0.1;

结果:

--------------------------------------
| id   | events | rand_value         |
--------------------------------------
| c    |      1 | 0.5512495763145849 | <- not what I expected
--------------------------------------

我无法使用此sql小提琴来复制该链接,然后单击蓝色[run sql]按钮几次

CREATE TABLE Table1
    (`x` int)
;
INSERT INTO Table1
    (`x`)
VALUES
    (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
;

查询1

select 
  * 
from (
      select  
             *
           , rand() as rand_value
      from Table1
      ) a_rand 
where 
  rand_value < 0.1

[结果]

| x |          rand_value |
|---|---------------------|
| 1 | 0.03006686086772649 |
| 1 | 0.09353976332912199 |
| 1 | 0.08519635823107917 |

相关内容

  • 没有找到相关文章

最新更新