使用子查询和rand()进行随机抽样会产生意外结果

时间:2017-09-28 01:27:21

标签: mysql sql subquery correlated-subquery

编辑:如果它有任何区别,我使用的是mysql 5.7.19。

我有一张表A,我试图平均随机抽样10%的行。我已经决定在子查询中使用rand(),然后过滤掉随机结果就可以了,但它会产生意想不到的结果。当我在过滤后打印出随机生成的值时,我得到的随机值与我的主查询的“where”子句不匹配,所以我想它是在外部select中重新生成随机值。

我想我错过了一些与子查询有关的事情,当事情被执行时,但我真的不确定发生了什么。

任何人都可以解释我可能做错了吗?我查看了这篇文章:In which sequence are queries and sub-queries executed by the SQL engine?,我的子查询是相关的,所以我假设我的子查询首先执行,然后主查询过滤掉它。鉴于我的假设,我不明白为什么结果具有应该被过滤掉的值。

查询:

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
--------------------------------------

1 个答案:

答案 0 :(得分:0)

我无法使用this SQL Fiddle使用该链接重现并点击蓝色[运行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 |