0

この投稿に基づいて、グループ (チャンク) からランダムなレコードを選択するこのクエリを取得しました。(背景については、SQLiteグループ内のランダム レコードの選択を参照してください) しかし、新しいフィールド "qcinfo" が "Y" に設定されている行を除外する必要があることに気付きました。

もちろん、これは、ランダム ID が qcinfo = 'Y' の ID にヒットするたびに行を非表示にしますが、これは間違っています。チャンクで考慮されないように行を除外する必要がありますが、レコードに qcinfo <> 'Y' がある場合は、チャンクのランダム レコードを生成します。

select  t.chunk ,t.id, t.qcinfo, t.link from  table1
inner join
        (
        select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
        from table1
        group by chunk
        ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id
where qcinfo <> 'Y'

以下をデータとして考える

id|link|chunk|qcinfo
2|Yes|me1|Y
3|rr|me1|
4|yy|me1|
5|uu|you2|
6|Yes|you2|Y
7|waw|you2|
8|wewe|you2|
9|eff|you2|
10|wefw|him3|
11|Yes|him3|Y
12|we|him3|
13|wefr|him3|

次の (コメント行に注意してください) は、必要なものを示していますが、Y を除外していません。サブクエリに WHERE を含めると、レコードが取得されず、理由がわかりません。

select  t.chunk ,t.id, t.qcinfo, t.link from    marlintag t
inner join
        (
        select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
        from    marlintag
--  where qcinfo <> 'Y'
        group by chunk ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id
4

1 に答える 1

1

WHERE 句をサブクエリに移動します。

select  t.chunk ,t.id, t.qcinfo, t.link from  table1
inner join
        (
        select chunk ,cast(min(id)+abs(random() % (max(id)-min(id)))as int) AS random_id
        from table1
        where qcinfo <> 'Y'
        group by chunk
        ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id
于 2013-08-13T19:25:17.557 に答える