Postgresql:从两个联接表中选择最大值
我有两张桌子:Postgresql:从两个联接表中选择最大值,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有两张桌子: tbl_status: id status_code month_digest_id project_id tbl_project id name tbl_month_digest: id month_ts 我有一个项目。每个项目的状态为零个月或多个月(存储在tbl_month_digest中)。给定一个项目ID列表,我需要获取最新的状态对象 我做这件事有困难。在MySQL中,我能够从tbl\u month\u digest和tbl\u st
tbl_status:
id
status_code
month_digest_id
project_id
tbl_project
id
name
tbl_month_digest:
id
month_ts
我有一个项目。每个项目的状态为零个月或多个月(存储在tbl_month_digest中)。给定一个项目ID列表,我需要获取最新的状态对象
我做这件事有困难。在MySQL中,我能够从tbl\u month\u digest
和tbl\u status
的连接中进行选择,并添加一个具有tbl\u month\u digest.month\u ts=max(tbl\u month\u digest.month)
。Postgres坚持我将tbl\u month\u digest.month\u ts
添加到group by中,但没有达到预期效果
是否可以在postgresql中的单个SQL查询中获取项目列表的最新状态
示例数据和预期结果:
tbl_month_digest:
id month_ts
1 2014-05-01
2 2014-06-01
3 2014-07-01
tbl_project:
id name
90 'Foundation'
91 'Testing'
92 'Examination'
tbl_status:
id project_id month_digest_id status_code
1 90 1 'on_track'
2 90 2 'on_track'
3 90 3 'late'
4 91 1 'late'
5 91 2 'unknown'
6 91 3 'unknown'
7 92 1 'late'
8 92 2 'late'
9 92 3 'on_track'
鉴于项目ID为90和91,我希望
project_id latest_status
90 'late'
92 'on_track'
我不确定为什么
91
的最新状态是在轨道上
。但是,您可以使用窗口函数做您想做的事情
我猜您甚至不需要month\u digest
表,因为ID通常是按时间顺序排列的
select s.project_id, s.status as latest_status
from (select s.*,
row_number() over (partition by project_id order by month_digest_id desc) as seqnum
from tbl_status s
where project_id in (90, 91)
)
where seqnnum = 1;
您可以使用连接执行基本相同的操作:
select s.project_id, s.status as latest_status
from (select s.*,
row_number() over (partition by project_id order by md.month_ts desc) as seqnum
from tbl_status s join
tbl_month_digest md
on s.month_digest_id = md.id
where project_id in (90, 91)
)
where seqnnum = 1;
编辑:
实际上,在Postgres中,您可以在
上使用distinct:
select distinct on(s.project_id) s.project_id, s.status as latest_status
from tbl_status s join
tbl_month_digest md
on s.month_digest_id = md.id
where s.project_id in (90, 91) and s.status <> 'unknown'
order by s.project_id, md.month_ts desc;
在(s.project\u id)s.project\u id、s.status上选择distinct作为最新的\u状态
从tbl_状态加入
tbl_月_摘要md
在s.month\u digest\u id=md.id上
其中s.project_id位于(90,91)中,s.status为“未知”
按s.project\u id、md.month\u ts desc订购;
我不确定你想对未知状态做什么。这只是将它们过滤掉。对不起。我想把‘92’放在轨道上。由于实际实现中的细节,我不能依赖月份摘要的id作为
月份的代理-
——我需要查看实际月份。