ОБНОВЛЕНИЕ PostgreSQL с регистром и подзапросом, чтобы получить значение из строки прямо выше - PullRequest
0 голосов
/ 02 ноября 2018

Учитывая следующую таблицу:

+-------+-----+----+
| genre | ref | id |
+-------+-----+----+
| CIT   | 000 |  1 |
| RP    | 111 |  2 |
| RV    |     |  3 |
| RP    | 777 |  4 |
| HY    |     |  5 |
| RB    | 222 |  6 |
| RV    |     |  7 |
+-------+-----+----+ 

Я ищу оператор UPDATE, который проверит, является ли строка, непосредственно следующая за строкой с жанром 'RP' или 'RB', строкой с жанром 'RV', и если да, то она должна обновиться со значением из строка прямо над ней (всегда прямо над; 'id-1'). Таким образом, в этом тестовом случае это будет выглядеть так:

+-------+-----+----+
| genre | ref | id |
+-------+-----+----+
| CIT   | 000 |  1 |
| RP    | 111 |  2 |
| RV    | 111 |  3 |
| RP    | 777 |  4 |
| HY    |     |  5 |
| RB    | 222 |  6 |
| RV    | 222 |  7 |
+-------+-----+----+ 

Большое спасибо за любые предложения!

1 Ответ

0 голосов
/ 02 ноября 2018

Моя первая мысль - использовать оконные функции:

update t
    ref = tt.ref
from (select t.*,
             lag(ref) over (order by id) as prev_ref
      from t
     ) tt
where tt.id = t.id and
      t.genre = 'RV' and
      t.prev_genre in ('RP', 'RB');

Если вы знаете, что в идентификаторах нет пробелов, вы можете использовать объединения:

update t
    set t.ref = tprev.ref
from t tprev cross join
     t tnext
where tprev.id = t.id - 1 
      t.genre = 'RV' and
      tprev.genre in ('RP', 'RB');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...