#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