【发布时间】:2021-11-12 16:00:28
【问题描述】:
我有一种情况,我将每个成员的可用性存储在一个表中。 这是一个有 4 列的简单表格。
CREATE TABLE availablities (
availablity_id serial PRIMARY KEY,
member_id serial,
availablity_status_id serial,
start_date timestamp
);
每个成员可以在表中有多个记录并获取当前状态 我为每个成员获取最近 start_date 小于 now() 的记录。
我首先尝试了一个幼稚的 Max() 和 Group by query
select
status_code, max(start_date) start_date,availablities.member_id
from
availablities
join
availablity_status on availablity_status.availablity_status_id = availablities.availablity_status_id
where
start_date <= now()
group by
status_code,availablities.member_id;
但这会为每个用户返回多条记录,因为我按用户和状态获取最新记录。
我终于想出了一个可以给我预期结果的查询。
select status_code,start_date,a2.member_id from availablities a2
join availablity_status on availablity_status.availablity_status_id = a2.availablity_status_id
where a2.availablity_id in(
select
max(availablity_id)
from availablities a
where
a.member_id = a2.member_id and
start_date in(
select
max(start_date) start_date
from availablities
where
start_date <= now()
and a.member_id = availablities.member_id
)
);
但是这个查询需要 60 倍的时间来执行并且感觉不对。 我很确定一定有更好的解决方案,但我无法动手。
获得预期结果的正确方法是什么?
我创建了一个 DB-fiddle 以使其更易于查看。查询 1 不正确,当我们有更多数据时,查询 2 会慢得多。
【问题讨论】:
标签: sql postgresql performance