在每个类别中获取 N 个最近的记录。 Postgres

Get N most recent records in each category. Postgres

问题是关于在每个类别中过滤 N 个最近的记录。

create table administration_entrieschangelog
(
    id              serial                   not null
        constraint administration_entrieschangelog_pkey
            primary key,
    object_id       integer                  not null
        constraint administration_entrieschangelog_object_id_check
            check (object_id >= 0),
    access_time     timestamp with time zone not null,
    as_who          varchar(7)               not null
        constraint as_who_check
            check ((as_who)::text = ANY
                   ((ARRAY ['CREATOR'::character varying, 'SLAVE'::character varying, 'MASTER'::character varying, 'FRIEND'::character varying, 'ADMIN'::character varying, 'LEGACY'::character varying])::text[])),
    operation_type  varchar(6)               not null
        constraint operation_type_check
            check ((operation_type)::text = ANY
                   ((ARRAY ['CREATE'::character varying, 'UPDATE'::character varying, 'DELETE'::character varying])::text[])),
    category_id integer                  not null

这里我想通过access_time在每个类别中除以category_id得到N条最近的(例如4条)记录。 无法弄清楚如何使用 UNION 在半手动之外执行此操作。对于 N=1 很明显,但对于 N > 1 则不然。 你能告诉我如何以简洁和通用的方式这样做吗?

DB-Postgres 12

谢谢!

这通常使用 window 函数完成:

select id, object_id, access_time, as_who, operation_type, category_id
from (
  select *, 
         dense_rank() over (partition by category_id order by access_time desc) as rn
  from administration_entrieschangelog
) t
where rn <= 4;