У меня есть следующая таблица с объединенным первичным ключом id
и ts
для реализации историзации:
create table "author" (
"id" bigint not null,
"ts" timestamp not null default now(),
"login" text unique not null,
primary key ("id", "ts")
);
Теперь меня интересует только последнее значение login
. Для этого я группирую по id
:
select "id", max("ts"), "login" from "author" group by "id";
Но это выдает ошибку: login
должен использоваться в статистической функции.
id
и max("ts")
однозначно идентифицируют строку, потому что набор (id, ts) является первичным ключом. Мне нужен login
, который соответствует строке, обозначенной id
и max("ts")
.
Я могу написать дополнительный выбор, чтобы найти login
:
select ao."id", max(ao."ts"),
(select ai.login from "author" ai
where ao."id" = ai."id" and max(ao."ts") = ai.ts)
from "author" ao
group by "id";
Это работает, но это довольно шумно и не очень умно, потому что он ищет всю таблицу, хотя поиск группы будет достаточно.
Существует ли агрегатная функция, которая позволяет избежать выбора и дает мне оставшиеся login
, которые принадлежат id
и max("ts")
?