Обновить столбец в postgresql с помощью подзапроса

#postgresql #group-by #sql-update #partition

#postgresql #сгруппировать по #sql-обновление #раздел

Вопрос:

У меня есть имя таблицы «table1», подобное этому, в базе данных postgresql:

 CREATE TABLE table1(
id TEXT,
class INT,
r1 DATE,
r2 DATE
);



INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x2', 2, '1/25/2015', '1/25/2015');

INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x2', 3, '6/28/2015', '1/25/2015');

INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x2', 3, '6/18/2015', '1/25/2015');

INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x5', 2, '9/3/2015', '1/25/2015');

INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x3', 1, '9/3/2015', '1/25/2015');

INSERT INTO public.table1 (id, class, r1, r2)
VALUES ('x3', 1, '8/3/2015', '1/25/2015');
  

Что я хочу сделать, так это обновить столбец R2 таким образом, чтобы для каждого набора идентификаторов и классов R2 был как минимум R1 для этой группы:

ожидаемый вывод:

введите описание изображения здесь

Я пытаюсь сделать что-то вроде, но это не дает мне правильного результата:

 
UPDATE table1
SET r2 = subquery.p FROM (select id, class, r1, min(r1) OVER (partition by class, id) AS p
FROM table1) AS subquery
  

Может кто-нибудь, пожалуйста, помочь мне с запросом?

Спасибо

Комментарии:

1. Пожалуйста, разместите код и данные в виде текста, а не изображений, или, что еще лучше, создайте скрипку с вашими данными в любом dbfiddle.uk или db-fiddle.com . Это значительно облегчит другим пользователям ответ на ваш вопрос.

2. Выполнено. Не могли бы вы, пожалуйста, проверить еще раз? Спасибо.

Ответ №1:

Это, вероятно, проще всего сделать с помощью обновления с присоединением к CTE минимальных значений:

 WITH CTE AS (
  select id, class, min(r1) OVER (partition by class, id) AS p
  FROM table1
)
UPDATE table1 t1
SET r2 = CTE.p
FROM CTE
WHERE CTE.id = t1.id AND CTE.class = t1.class
  

Опубликуйте обновление с вашими образцами данных:

 id  class   r1          r2
x2  2       01/25/2015  01/25/2015
x2  3       06/28/2015  06/18/2015
x2  3       06/18/2015  06/18/2015
x3  1       09/03/2015  08/03/2015
x3  1       08/03/2015  08/03/2015
x5  2       09/03/2015  09/03/2015
  

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