【问题标题】:Joining tables by using the maximum value of one of the tables使用其中一个表的最大值连接表
【发布时间】:2016-03-15 02:30:30
【问题描述】:

我在连接 ID 列和 EVNT_SEQ 最大值的两个表时遇到了困难。例如,我有一个满是用户的表,我想查看他们最近的操作。 evnt_tbl 为每个用户事件添加一行。我想编写一个返回所有用户及其最近事件(EVNT_SEQ 的 MAX)的查询。

数据库版本:IBM DB2 9.7.8

person_tbl

ID    NAME
1     Ben
2     Joe
3     Jane
4     Albert
5     Paul

evnt_tbl

ID    EVNT_SEQ    EVNT_NM
1     1           NULL
1     2           max
2     1           NULL
2     2           NULL
2     3           max
3     1           max
4     1           NULL
4     2           max
5     1           NULL
5     2           max

想要的查询结果

ID    NAME     EVNT_SEQ    EVNT_NM
1     Ben      2           max
2     Joe      3           max
3     Jane     1           max
4     Albert   2           max
5     Paul     2           max

我以为我可以写如下内容,但出现错误:

SELECT person.ID, person.NAME, evnt.EVNT_SEQ, evnt.EVNT_NM
FROM person_tbl person
LEFT JOIN evnt_tbl evnt ON person_tbl.ID = evnt.ID
    AND evnt.EVNT_SEQ = (SELECT MAX(EVNT_SEQ) 
                             FROM event_tbl evnt2 
                             WHERE evnt.ID = evnt2.ID)

【问题讨论】:

  • 你得到什么错误?
  • 看起来你已经有一个字段告诉你哪一行是最大值。为什么需要在查询中重新计算?
  • @Rabbit 抱歉,这是误导。那只是为了演示目的。在实际表中,事件有不同的名称。
  • 然后就可以使用ROW_NUMBER()函数,对ID进行分区,并按事件顺序降序排列,只返回行号等于1的那些。
  • Duplicate 的标准greatest-n-per-group 问题。

标签: sql db2


【解决方案1】:

使用派生表获取事件表中每个 id 的最大值。然后将结果加入到 person 表中。

select t.id, p.name, t.maxevseqm, t.maxevnum
from (SELECT ID, max(EVNT_SEQ) as maxevseq, max(EVNT_NM) as maxevnum
      FROM event_tbl
      group by id) t
join person_tbl on p.id = t.id

【讨论】:

  • 从最新评论来看,EVNT_NM 不保证为最大值。
【解决方案2】:
select
  p.id, p.name, e.EVNT_SEQ, e.EVNT_NM
from 
  person_tbl p
inner join
  evnt_tbl e
on 
  p.id = e.id and e.EVNT_SEQ =
  (
  select MAX(EVNT_SEQ)
  from evnt_tbl xe
  where xe.id = p.id
  ) 

SQLFIDDLE测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2014-12-26
    • 2010-12-24
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多