分组数据并在postgres中每组显示1行

时间:2018-08-02 16:00:46

标签: sql postgresql

我有两个看起来像这样的表:-

组件表

enter image description here

修订表

enter image description here

我想从该表中获取名称,model_id,rev_id,以便结果集具有如下所示的数据:-

name    model_id    rev_id  created_at
ABC     1234        2       23456
ABC     5678        2       10001
XYZ     4567    

此处数据按名称,model_id进行分组,并且每个组仅显示1个数据,这些数据具有created_at的最大值。

我正在使用以下查询,但结果不正确。

SELECT cm.name,cm.model_id,r.created_at from dummy.component cm 
left join dummy.revision r on cm.model_id=r.model_id 
group by cm.name,cm.model_id,r.created_at
ORDER BY cm.name asc,
r.created_at DESC;

结果:-

enter image description here

我们将不胜感激任何人的帮助。

3 个答案:

答案 0 :(得分:1)

使用max and sub-query

select T1.name,T1.model_id,r.rev_id,T1.created_at  from      

(
select cm.name,
    cm.model_id,    
    MAX(r.created_at) As created_at from dummy.component cm 
    left join dummy.revision r on cm.model_id=r.model_id 
    group by cm.name,cm.model_id

) T1
left join revision r
  on T1.created_at =r.created_at

http://www.sqlfiddle.com/#!17/68cb5/4

name    model_id    rev_id  created_at
ABC       1234       2           23456
ABC       5678       2           10001
xyz       4567  

答案 1 :(得分:0)

在SELECT中,您缺少rev_id

尝试一下:

SELECT 
cm.name,
cm.model_id,
MAX(r.rev_id) AS rev_id,
MAX(r.created_at) As created_at
from dummy.component cm 
left join dummy.revision r on cm.model_id=r.model_id 
group by 1,2
ORDER BY cm.name asc,
r.created_at DESC;

您所缺少的是说您只想要连接表中的最大记录的语句。因此,您需要联接记录,但是联接将引入表r中的所有记录。如果按组件中的2列分组,然后从r,id和创建日期中选择最大值,则只会从顶部选择要加入的行列

答案 2 :(得分:0)

我会使用distinct on

select distinct on (m.id) m.id, m.name, r.rev_id, r.created_at
from model m left join
     revision r
     on m.model_id = r.model_id
order by m.id, r.rev_id;