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

如何在左连接中按最大日期分组

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

    我在Oracle DB中有三个表

    House (
      id
    )
    
    Person (
      id,
      house_id
    )
    
    Bill (
      id,
      date,
      amount,
      person_id
    )
    

    我需要获得名单,如果有人的身份证和金额从最后一个法案如果存在的房子id。最后一个法案是最古老的日期字段的法案。 我可以通过个人id通过以下方式获取:

    SELECT
     p.id,
     b.amount
    FROM Person p
    LEFT JOIN 
    (SELECT amount FROM Bill WHERE date =
     (SELECT MAX(date) FROM Bill b1 WHERE person_id = 1)
    ) b ON b.person_id = p.id 
    WHERE p.id = 1;
    

    我可以按众议院id获得个人id清单和最新账单金额吗?

    样本数据:

    House(id:1)
    House(id:2)
    
    Person(id:1, house_id:1)
    Person(id:2, house_id:1)
    Person(id:3, house_id:2)
    
    Bill(id:1, date:01-11-2011, amount:100, person_id:1)
    Bill(id:2, date:01-11-2012, amount:200, person_id:1)
    Bill(id:3, date:01-11-2011, amount:90, person_id:2)
    Bill(id:4, date:01-11-2012, amount:10, person_id:2)
    Bill(id:5, date:01-11-2011, amount:190, person_id:3)
    

    按房屋id选择的结果=1:

    person_id:1, amount:200
    person_id:2, amount:10
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    您可以通过聚合实现这一点:

    select p.person_id,
           max(b.amount) keep (dense_rank first order by b.date desc) as most_recent_amount
    from bill b join
         person p
         on b.person_id = p.id
    where p.house_id = 1
    group by p.person_id;