【发布时间】: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 问题。