Выберите положение строки в фильтрованном и упорядоченном списке строк PostgreSQL - PullRequest
0 голосов
/ 01 июня 2018

Я получил этот запрос,

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 Ответ

0 голосов
/ 01 июня 2018

Почему бы не выбрать их первым?

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)

(не проверено хотя бы потому, что у меня не было достаточно контекста для тестирования)

...