Как выбрать случайную запись для каждой группы - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть таблица типа

 |    A   | B | C | D |
 |--------|---|---|---|
 | Value1 | x | x | x |
 | Value1 | y | x | y |
 | Value1 | x | x | x |
 |        ....        |
 | Value2 | x | x | x |
 | Value2 | x | x | x |
 | Value2 | x | x | x |
 |        ....        |
 | Value3 | x | x | x |
 | Value3 | x | x | x |
 | Value3 | x | x | x |

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

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Вы можете использовать оконные функции:

select *
from (
    select 
        t.*,
        row_number() over(partition by a order by random()) rn
    from mytable t
) t
where rn = 1

row_number() назначает случайный ранг каждой записи в группах, имеющих одинаковые a; затем внешний запрос фильтрует одну запись на группу.

На самом деле, поскольку вы запускаете Postgres, вы также можете использовать distinct on, что может повысить производительность (и сократить синтаксис):

select distinct on (a) t.*
from mytable t
order by a, random();
1 голос
/ 11 февраля 2020

Вы можете сделать это с помощью distinct on:

select distinct on (a) a, b, c, d
from test t;

Вот демоверсия

С DISTINCT ON, вы говорите PostgreSQL вернуть одну строку для каждой отдельной группы, определенной в предложении ON.

Подробнее об этом здесь: https://www.geekytidbits.com/postgres-distinct-on/

...