Postgresql. Как обновить столбец с диапазоном целых чисел от 0 до последней строки, которая удовлетворяет критериям WHERE - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий образец таблицы, который называется userz:

+----+---------------+----------+
| id | sort_position | type     |
+----+---------------+----------+
|  1 |            -5 | admin    |
|  2 |            -3 | customer |
|  3 |             1 | customer |
|  4 |             8 | employee |
|  5 |           200 | customer |
+----+---------------+----------+

С Mysql Если я хочу, чтобы sort_position всех типов customer начинался с 0 и ++ до последней строки, удовлетворяющей критерию WHERE, я могу сделать следующее:

SET @i=-1; 
UPDATE userz 
SET sort_position=@i:=@i+1 
WHERE type = "customer" ORDER BY sort_position;

и я получил бы ожидаемый результат:

+----+---------------+----------+
| id | sort_position | type     |
+----+---------------+----------+
|  1 |            -5 | admin    |
|  2 |             0 | customer |
|  3 |             1 | customer |
|  4 |             8 | employee |
|  5 |             2 | customer |
+----+---------------+----------+

как видите, все клиенты теперь назначены с правильным sort_position из 0,1,2

Но так как я работаю с Postgre, мне нужно достичь того же с ним. Что я пробовал до сих пор:

DO $$
DECLARE  
   i integer := -1;   
BEGIN  
   UPDATE userz 
   SET sort_position=@i:=@i+1 
   WHERE type = "customer" ORDER BY sort_position;
END $$;

и у меня есть ошибки около =@i:=@i+1, пробовал другое форматирование, которое я погуглил как =i:=i+1, но все равно не повезло.

1 Ответ

0 голосов
/ 07 мая 2018

Попробуйте ниже SQL;

update userz k
set sort_position = 
     (select ROW_NUMBER() over(order by sort_position)-1 rnum
         from userz src
        where src.type ='customer'
          and id = k.id)
...