2013-08-30 1 views
8

У меня есть таблица, которая грубо:Выберите случайную строку для каждой группы в таблице Postgres

id | category | link | caption | image 

Моя цель состоит в том, чтобы принести случайную строку из каждой отдельной категории в таблице, для всех категорий в Таблица. План состоит в том, чтобы затем назначить каждой строке переменной для соответствующей категории.

Сейчас я использую несколько ЗЕЬЕСТА, напоминающий:

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

Но это, кажется, безвкусные и создает больше поездок в БД, которая стоит дорого.

Я уверен, что есть способ сделать это с помощью оконных функций в Postgres, но у меня нет опыта с ними, и я не совсем уверен, как использовать его для получения того, что я хочу.

Спасибо за помощь!

ответ

12

Try что-то вроде:

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

Или с оконными функциями:

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

Отлично! Оба эти, похоже, работают для моих целей. Спасибо! – Steve