Как выкладывать / распространять число в Postgres SQL - PullRequest
1 голос
/ 07 января 2020

У меня есть следующая таблица:

id    rank    user
1      1       1
2      1       1
3      1       2
4      2       1
5      2       1

Я хотел бы распределить значение rank для данного пользователя между 1 (или 0) и максимальным значением, чтобы оставить пробел между значениями. Например, я хотел бы распространить rank для пользователя 1, с максимальным значением 100 (в данном случае), результат должен быть:

id    rank    user
1      20      1
2      40      1
3      1       2
4      60      1
5      80      1

Я думал вычислить increment = maxValue / count(items) + 1 а затем выполните много UPDATE запросов, используя increment для каждого нового, но это кажется крайне неэффективным. Есть ли способ сделать это лучше, может быть, с одним большим UPDATE запросом, что-то вроде:

UPDATE MyTable
SET rank = increment * ??? (?current position? in SELECT * FROM MyTable WHERE user = 1 ORDER BY rank)
WHERE user = 1

1 Ответ

2 голосов
/ 07 января 2020

Вы можете достичь этого результата, используя CTE для генерации номера строки (rn) для каждой записи для пользователя (в порядке rank с id для заказа дубликатов), а также счетчик ( cnt) числа строк для этого пользователя, а затем установите rank для этого пользователя:

rn * 100 / (cnt + 1)

В качестве запроса:

WITH CTE AS (
  SELECT id, user, 
         ROW_NUMBER() OVER (PARTITION BY user ORDER BY rank, id) AS rn,
         COUNT(*) OVER (PARTITION BY user) AS cnt
  FROM MyTable
  WHERE "user" = 1
)
UPDATE MyTable
SET rank = CTE.rn * 100 / (CTE.cnt + 1)
FROM CTE
WHERE MyTable.id = CTE.id

Результирующая таблица :

id  rank    user
1   20      1
2   40      1
3   1       2
4   60      1
5   80      1

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...