【问题标题】:How to GROUP BY max date in left join如何在左连接中按最大日期分组
【发布时间】:2018-05-10 17:24:54
【问题描述】:

我在 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)

house_id = 1 的选择结果:

person_id:1, amount:200
person_id:2, amount:10

【问题讨论】:

  • @GordonLinoff 完成
  • 如果您添加了一条记录Person(id:4, house_id:1)但没有相关账单,您是要显示金额为零或空的人4还是不显示人4?
  • 您不想在结果中显示日期?
  • @ThorstenKettner 不,只是数量

标签: sql oracle group-by left-join greatest-n-per-group


【解决方案1】:

您可以通过聚合来做到这一点:

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;

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    相关资源
    最近更新 更多