在组sqlite中选择随机记录

时间:2013-08-01 19:40:07

标签: sql sqlite select random

我似乎无法理解这一点。我在SQlite中有一个表,我需要从中为EACH组选择一个random()记录。因此,考虑如下表:

id         link       chunk

2           a           me1

3           b           me1

4           c           me1

5           d           you2

6           e           you2

7           f           you2

我需要sql,它会为每个块返回一个随机链接值。所以有一次我运行它会给:

me1    |   a
you2   |   f

下次可能是

me1    |   c
you2   |   d

我知道类似的问题已得到解答,但我找不到适用于此处的推文。

更新:

Nuts,跟进问题:现在我需要排除新字段“qcinfo”设置为'Y'的行。

当然,每当随机ID到达qcinfo ='Y'时,就会隐藏行,这是错误的。我需要排除在块中考虑行,但如果任何记录有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'

2 个答案:

答案 0 :(得分:3)

有点hackish,但它的确有效......请参阅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
抱歉,我以为你说的是​​MySQL。 这是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

答案 1 :(得分:0)

请注意,当我们按进行无分组

进行分组时,SQLite返回与该分组相对应的第一个值
select link, chunk from table group by chunk;

运行它将获得此

me1 | a
you2| d

现在,您可以通过对表格进行随机排序然后分组来使第一个值为随机变量。这是最终的解决方案。

select link, chunk from (select * from table order by random()) group by chunk;