在每个类别中获取 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;
问题是关于在每个类别中过滤 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;