2013-08-30 17 views
8

Mam tabeli, która jest grubsza:Wybierz losowy wiersz dla każdej grupy w tabeli postgres

id | category | link | caption | image 

Moim celem jest, aby pobrać losowe wiersz z każdej odrębnej kategorii w tabeli, dla wszystkich kategorii w stół. Planuje następnie przypisać każdy wiersz do zmiennej dla odpowiedniej kategorii.

Teraz używam wielu SELECT przypominające:

SELECT link, caption, image FROM table WHERE category='whatever' ORDER BY RANDOM() LIMIT 1

Ale to wydaje nieeleganckie i tworzy kolejne wycieczki do DB, co jest kosztowne.

Jestem prawie pewny, że istnieje sposób, aby to zrobić z funkcjami okna w Postgresie, ale nie mam z nimi żadnego doświadczenia i nie jestem do końca pewny, jak go użyć, aby uzyskać to, co chcę.

Dzięki za wszelką pomoc!

Odpowiedz

12

spróbować czegoś jak:

SELECT DISTINCT ON (category) * 
FROM table 
ORDER BY category, random(); 

Albo z funkcji okna:

SELECT * 
FROM (
SELECT *, row_number() OVER (PARTITION BY category ORDER BY random()) as rn 
FROM table) sub 
WHERE rn = 1; 
+0

Doskonała! Obie wydają się działać dla moich celów. Dziękuję Ci! – Steve

Powiązane problemy