Но при этом возвращаются все записи для этой части, даже старые.
Это потому, что вы группируете по part_id, amount
обеим, что учитывает несколько групп для каждой part_id
, так как количество отличается для каждой записи.Чтобы получить только part_id
и MAX(timestamp)
, достаточно просто удалить amount
в group by
и select
.Если вы также хотите получить сумму, тогда
Вы можете использовать аналитическую функцию MAX
и найти запись с этим change_timestamp
SELECT part_id
,amount
,change_timestamp
FROM (
SELECT p.*
,max(change_timestamp) OVER (PARTITION BY part_id) max_change_timestamp
FROM price p
)
WHERE change_timestamp = max_change_timestamp;
Или использовать row_number
, который вы уже нашлив другом ответе.
Или используя коррелированный запрос:
SELECT part_id
,amount
,change_timestamp
FROM price p1
WHERE change_timestamp = (
SELECT MAX(change_timestamp)
FROM price p2
WHERE p2.part_id = p1.part_id
);
или LAST
(но не в последнюю очередь) агрегатная функция:
SELECT part_id
,MAX(amount) KEEP DENSE_RANK(LAST ORDER BY change_timestamp)
,MAX(change_timestamp)
GROUP BY part_id;