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作为
月份的代理-
——我需要查看实际月份。