Seleccione una fila aleatoria para cada grupo

Tengo una table como esta

ID ATTRIBUTE 1 A 1 A 1 B 1 C 2 B 2 C 2 C 3 A 3 B 3 C 

Me gustaría seleccionar solo un atributo aleatorio para cada ID. El resultado por lo tanto podría verse así (aunque esta es solo una de las muchas opciones

 ATTRIBUTE B C C 

Este es mi bash en este problema

 SELECT "ATTRIBUTE" FROM ( SELECT "ID", "ATTRIBUTE", row_number() OVER (PARTITION BY "ID" ORDER BY random()) rownum FROM table ) shuffled WHERE rownum = 1 

sin embargo, no sé si esta es una buena solución, ya que necesito introducir numbers de fila, lo cual es un poco engorroso.

¿Tienes uno mejor?

 select distinct on (id) id, attribute from like_this order by id, random() 

Si solo necesitas la columna de atributo:

 select distinct on (id) attribute from like_this order by id, random() 

Tenga en count que aún necesita orderar por id primero, ya que es una columna de la distinct on .

Si solo quieres los attributes distintivos:

 select distinct attribute from ( select distinct on (id) attribute from like_this order by id, random() ) s 

Ponga un gran número random delante de cada logging (id) y elija dentro de cada grupo el logging con el número aleatorio más bajo.

 $ cat test.txt \N 1 a \N 2 b \N 2 c \N 2 d \N 3 e \N 4 f $ mysql USE test; DROP TABLE test; CREATE TABLE test (id0 INT NOT NULL AUTO_INCREMENT, id VARCHAR(1), attribute VARCHAR(1), PRIMARY KEY (id0)); LOAD DATA LOCAL INFILE '~/mysql/test.txt' INTO TABLE test FIELDS TERMINATED BY '\t'; DROP TABLE rtest; CREATE TABLE rtest (random INT(8), id0 VARCHAR(1), id VARCHAR(1), attribute VARCHAR(1), PRIMARY KEY (id, random)); INSERT INTO rtest SELECT CAST(1000000. * rand() AS INT) AS random, test.* FROM test; SELECT rtest.* FROM rtest, (SELECT id, min(random) AS random FROM rtest GROUP BY id) AS sample WHERE rtest.random=sample.random AND rtest.id=sample.id;