2013-08-01 117 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擴展。) –