Как обновить значение MAX () - PostgreSQL - PullRequest
0 голосов
/ 27 мая 2020

У меня есть 2 таблицы:

tableA

id  name    group_id    group_name  sub_state
1   User1       1            MG      active
2   User3       3            AG      active

TableB

tableA_id       v_date                group_id
   1        2020-01-20T21:51:24.000Z     1          
   2        2020-03-10T21:20:24.000Z     3   
   1        2020-05-05T23:20:24.000Z     1   
   2        2020-05-13T23:20:24.000Z     3   

Я хочу обновить самые последние v_date каждого пользователя для нового Дата. Я считаю, что здесь было бы полезно использовать MAX ().

Я пробовал:

UPDATE tableB
SET v_date = '2020-05-27 20:00:13+00'
WHERE v_date = (SELECT MAX(v_date) FROM tableB
     LEFT JOIN tableA ON tableB.tableA_id = tableA.id AND tableB.group_id = tableA.group_id
     WHERE tableA.sub_state = 'active'
     GROUP BY tableA.id);

Этот запрос возвращает ошибку: Query Error: error: more than one row returned by a subquery used as an expression

Затем я попробовал:

WITH stat AS (
    SELECT MAX(v_date) FROM tableB
    LEFT JOIN tableA ON tableB.tableA_id = tableA.id AND tableB.group_id = tableA.group_id
    WHERE tableA.sub_state = 'active' AND tableA.group_id = 1
    GROUP BY tableA.id
)   
UPDATE tableB
SET v_date = '2020-05-27 20:00:13+00'
FROM stat
WHERE group_id = 1;

Это изменяет дату всех записей, а не только последнюю или недавнюю.

Как я могу обновить последнюю запись от каждого пользователя, не затрагивая все записи за все время?

1 Ответ

1 голос
/ 27 мая 2020

Думаю, что вы хотите:

UPDATE tableB
SET v_date = '2020-05-27 20:00:13+00'
WHERE v_date = (
    SELECT MAX(tb1.v_date) 
    FROM tableB tb1
    WHERE tb1.tableA_id = tableB.tableA_id
)
...