2013-08-30 13 views
8

Ho una tabella che è più o meno:Selezionare riga casuale per ogni gruppo in una tabella postgres

id | category | link | caption | image 

Il mio obiettivo è quello di recuperare una riga a caso da ogni categoria distinta nella tabella, per tutte le categorie del tavolo. Il piano è quindi di assegnare ciascuna riga a una variabile per la rispettiva categoria.

In questo momento sto utilizzando più istruzioni SELECT che assomigliano:

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

Ma questo sembra poco elegante e crea più viaggi al DB, che è costoso.

Sono sicuro che c'è un modo per farlo con le funzioni di finestra in Postgres, ma non ho esperienza con loro e non sono del tutto sicuro di come usarne uno per ottenere ciò che voglio.

Grazie per qualsiasi aiuto!

risposta

12

provare qualcosa di simile:

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

O con funzioni finestra:

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

Eccellente! Entrambi sembrano funzionare per i miei scopi. Grazie! – Steve

Problemi correlati