在SQL Join中选择第二个表的顶行

时间:2012-01-30 08:52:41

标签: sql join

我必须使用名为USERSCOMM_HISTORY

的表格
USERS(user_id, name)
COMM_HISTORY(comm_history_id, comm_date, comm_by, user_id)

USERS表将包含唯一的用户列表,COMM_HISTORY可以包含user_id的重复项。当我加入他们时,我想从comm_date获取用户名和最新COMM_HISTORY

与此帖sql join - only select top row from 2nd table类似的内容,但似乎该帖子中没有正确答案。

我希望在加入时获得ff结果

1 John Doe 2012-01-29 Jane Doe

而不是

1 John Doe 2011-10-20 Jane Lee
2 John Doe 2012-01-29 Jane Doe
3 John Doe 2011-09-08 Jane Doe

任何人都有解决方案吗?

2 个答案:

答案 0 :(得分:0)

@ Andomar在另一个问题上的解决方案应该有效。适应您的用例,它将是:

SELECT USERS.*, COMM_HISTORY.*
FROM USERS
INNER JOIN COMM_HISTORY
  ON USERS.user_id = COMM_HISTORY.user_id 
LEFT JOIN COMM_HISTORY LATER_HISTORY
  ON COMM_HISTORY.user_id = LATER_HISTORY.user_id 
  AND LATER_HISTORY.comm_date > COMM_HISTORY.comm_date
WHERE LATER_HISTORY.user_id IS NULL

将历史记录表重新连接到自身,并设置一个条件,表示不应选择以后的历史记录行。

答案 1 :(得分:0)

使用cte的方法

with recent_comms as (
select 
   row_number() over (partition by user_id, order by comm_date decs) as rn,
   comm_date,
   comm_by, 
   user_id 
FROM comm_history)

select 
   users.name, 
   recent_comms.comm_date, 
   recent_comms.comm_by
from users
join recent_comms on users.user_id = recent_comms.user_id
and recent_comms.rn = 1
例如,

将rn = 1更改为rn< = 5将获得每个用户的最后5个。