选择sqlite中的随机记录组

选择sqlite中的随机记录组,sql,sqlite,select,random,Sql,Sqlite,Select,Random,我似乎无法理解这件事。我在SQlite中有一个表,我需要从中为每个组选择一个随机记录。因此,考虑如下表格: id link chunk 2 a me1 3 b me1 4 c me1 5 d you2 6 e you2 7 f

我似乎无法理解这件事。我在SQlite中有一个表,我需要从中为每个组选择一个随机记录。因此,考虑如下表格:

id         link       chunk

2           a           me1

3           b           me1

4           c           me1

5           d           you2

6           e           you2

7           f           you2
我需要为每个区块返回一个随机链接值的sql。所以有一次我运行它时会给出:

也许下次吧

我知道类似的问题已经得到了回答,但我没有找到一个适用于这里的推导

更新:

坚果,后续问题:所以现在我需要排除新字段qcinfo设置为“Y”的行

当然,每当随机ID碰到qcinfo='Y'时,这会隐藏行,这是错误的。我需要在区块中排除该行,但如果任何记录具有qcinfo“Y”,则仍然会为区块生成一个随机记录


有点老套,但它很管用。。。请参阅sql fiddle

对不起,我以为你说的是MySQL。 下面是SQLite的提琴和代码


注意,当我们在没有聚合的情况下执行group by时,SQLite返回与组对应的第一个值

运行,你会得到这个

me1 | a
you2| d
现在,您可以通过对表进行随机排序,然后分组,使第一个值成为随机值。这是最终的解决方案

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

组的数量是固定的还是可变的?如果我理解正确的话,是可变的。好奇的是:为什么要用这个来代替更简单的SELECT*FROM SELECT*FROM Table1 ORDER BY random GROUP BY chunk;?对于更大的数据集,它会更有效吗?他只希望每个“块”有一行。您的查询无法满足该要求。但我很感激你的随机订货idea@Declan_KGROUPBYCHUNK确保每个块只有一行。在这个上下文中允许非聚合表达式是一个SQLite扩展,这很酷。这在SQL Server中是行不通的。太棒了!非常感谢你!我永远也不会明白。
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'
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
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
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;