2013-08-01 121 views
2

我似乎无法得到我的头。我在SQlite中有一张表格,我需要为每个组选择一个random()记录。所以,考虑一个表如:组内选择随机记录sqlite

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 

我知道类似的问题已经回答了,但我没有找到一个的推导此处适用。

UPDATE:

坚果,跟进的问题:所以现在我需要排除其中一个新的领域“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' 
+0

代码或变量? –

+0

如果我正确理解问题,则为变量。 – JohnZastrow

回答

3

一个有点hackish,但它的工作原理...查看SQL小提琴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 
+3

好奇:为什么用这个而不是简单得多的'SELECT * FROM(SELECT * FROM Table1 ORDER BY random())GROUP BY chunk;'?对于较大的数据集会更有效吗? – rutter

+0

他只需要每个'块'的单行。您的查询不符合该要求。 (但是我欣赏'ORDER BY random()'的想法) –

+4

@Declan_K'GROUP BY chunk'确保每个块只有一行。 (在这种情况下允许非聚合表达式是一个SQLite扩展。) –