2017-09-28 13 views
0

編集:何か違いがあれば、私は5.7.19を使用しています。サブクエリとrand()を使用したランダムサンプリングで予期しない結果が発生する

私はテーブルAを持っており、ランダムに平均10%の行をサンプリングしようとしています。私は、サブクエリでrand()を使用し、そのランダムな結果をフィルタリングすることがトリックを行うと判断しましたが、予期しない結果が生じています。フィルタリングした後にランダムに生成された値を出力すると、メインクエリの「where」句と一致しないランダムな値が得られます。そのため、外側の選択肢のランダム値を再生成しているとします。

私はサブクエリと何かが実行されていないと思うが、何が起こっているのかは分かりません。

誰かが私が間違っていると説明することはできますか?私はこの投稿をチェックアウトしました: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 
-------------------------------------- 
+0

奇妙で再現性が、それが機能しているように、それは思えません。私は各クエリのテーブルの結果の約10%しか得ていませんが、なぜrand_valueカラムに0.1より大きい値が表示されているのかわかりません。 SELECT *、rand_valueとしてのrand()のサブクエリには関係なく、rand_value <0.1のFROMテーブルは同じ結果を返します。 – Devon

+1

クエリに相関サブクエリが含まれておらず、単純な「導出テーブル」 –

+0

ps:https://en.wikipedia.org/wiki/Correlated_subquery –

答えて

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 | 
関連する問題