@Syndr0me

Как разбить таблицу с пользователями по командам несколько раз?

Есть сущность users
5d318067b6d68584613368.png

Допустим, есть 100 пользователей в данной стадии поле command = null.

При определенных условиях необходимо обновить строки так, чтобы пользователь с наименьшими points стал в команде под одним номером с пользователем с наибольшими points, и так с каждыми по следующими по убыванию points. В конечном итоге получается 50 команд по 2 человека. Каким образом это проще сделать, писать логику на node и делать udpate по каждой строке или можно как то средствами postgre?

Далее нужно проделать то же самое, только вместо людей объединяются команды. То есть из 1 команды, где 2 человека, получается одна команда с 4 людьми в ней.
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
@kalter1808
Я не понял смысла числа в points, но полагаю что оно просто рандомное)
В таком случае, представляестся такое:
select id, points, row_number()  over (order by points) from users;

Эта команда отсортирует всех пользователей по points по возрастанию, и добавит им последовательный номер так, что у юзера с row_number = 1 будет наименьший points, а у максимального row_number - наибольший.
Благодаря последовательному ключу мы можем легко по циклу составить пары:
for i in range ({число юзеров}/2)
    USER (row_number = i) <-> USER (row_number = 100 - i)

Где собирать команду вместе - уже решать вам)
Но я считаю лучше всего для этих целей написать в postgres функцию, например, на pl/PgSQL.
Функция может пройтись по циклу и на лету сгенерировать таблицу с командными парами.
https://postgrespro.ru/docs/postgresql/11/plpgsql-...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
Поскольку points не уникально, то группировка будет случайной. И её невозможно выполнить одним запросом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы