Выберите положение строки в фильтрованном и упорядоченном списке строк PostgreSQL
Я получил этот запрос,
SELECT s.pos
FROM (SELECT t.guild_id, t.user_id
ROW_NUMBER() OVER(ORDER BY t.reputation DESC) AS pos
FROM users t) s
WHERE (s.guild_id, s.user_id) = ($2, $3)
который получает "звание" пользователя в гильдии, но я хочу отфильтровать результаты по записям в массиве t.user_id
значения (как {'1', '64', '83'}
) и это повлияет на pos
значение. я нашел FILTER
а также WITHIN GROUP
, но я не уверен, как вписать один из них в этот запрос. Как бы я это сделал?
Вот полная таблица, если это поможет вообще:
Table "public.users"
Column | Type | Collation | Nullable | Default
------------+-----------------------+-----------+----------+---------
guild_id | character varying(20) | | not null |
user_id | character varying(20) | | not null |
reputation | real | | not null | 0
Indexes:
"users_pkey" PRIMARY KEY, btree (guild_id, user_id)
1 ответ
Решение
Почему бы не выбрать по первым?
WITH UsersWeCareAbout AS (
SELECT * FROM users u WHERE u.user_id = ANY(subgroup_array)
), RepUsers AS (
SELECT t.guild_id, t.user_id, ROW_NUMBER() OVER(ORDER BY t.reputation DESC) AS pos
FROM UsersWeCareAbout t
) SELECT s.pos FROM RepUsers s WHERE (s.guild_id, s.user_id) = ($2, $3)
(не проверено хотя бы потому, что у меня не было достаточно контекста для тестирования)