代码之家  ›  专栏  ›  技术社区  ›  Sunny

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

  •  0
  • Sunny  · 技术社区  · 7 年前

    我有两张像这样的桌子:-

    组件表

    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    
    

    在这里,数据按名称、型号和id进行分组,每个组仅显示1个数据,其中created_的值最高。

    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 回复  |  直到 7 年前
        1
  •  1
  •   Zaynul Abadin Tuhin    7 年前

    使用 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  
    
        2
  •  0
  •   SuperSecretAndNotSafeFromWork    7 年前

    在您的选择中,您缺少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;
    

    您缺少的是一条语句,该语句表示您只需要联接表中的max记录。所以您需要联接记录,但联接将带来表r中的所有记录。如果您按组件中的2列进行分组,然后在id和创建日期上从r中选择最大值,它将只从可加入的列表中选择顶部

        3
  •  0
  •   Gordon Linoff    7 年前

    我会用 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;