Select random record within groups sqlite

2019-05-24 17:03发布

I can't seem to get my head around this. I have a single table in SQlite, from which I need to select a random() record for EACH group. So, considering a table such as:

id         link       chunk

2           a           me1

3           b           me1

4           c           me1

5           d           you2

6           e           you2

7           f           you2

I need sql that will return a random link value for each chunk. So one time I run it would give:

me1    |   a
you2   |   f

the next time maybe

me1    |   c
you2   |   d

I know similar questions have been answered but I'm not finding a derivation of one that applies here.

UPDATE:

Nuts, follow up question: so now I need to EXCLUDE rows where a new field "qcinfo" is set to 'Y'.

This, of course, hides rows whenever the random ID hits one where qcinfo = 'Y', which is wrong. I need to exclude the row from being considered in the chunk, but still generate a random record for the chunk if any records have 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'

1条回答
beautiful°
2楼-- · 2019-05-24 17:49

A bit hackish, but it works... See sql fiddle http://sqlfiddle.com/#!2/81e75/7

select  t.chunk
        ,t.link
from    table1 t
inner join
        (
        select chunk
               ,FLOOR(min(id) + RAND() * (max(id)-min(id))) AS random_id
        from    table1
        group by chunk
        ) sq
on      t.chunk = sq.chunk
and     t.id = sq.random_id

Sorry, I thought that you said MySQL. Here is the fiddle and the code for SQLite

http://sqlfiddle.com/#!5/81e75/12

select  t.chunk
        ,t.link
from    table1 t
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
查看更多
登录 后发表回答