2012-01-30 36 views
1

我對錶稱爲USERSCOMM_HISTORY選擇第二個表上排在SQL加入

USERS(user_id, name) 
COMM_HISTORY(comm_history_id, comm_date, comm_by, user_id) 

USERS表將有唯一的用戶列表,並COMM_HISTORY可以有user_id重複。當我加入他們時,我想從COMM_HISTORY獲取用戶的姓名和最近的comm_date

類似的帖子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 

任何人有一個解決方案?

+0

**什麼**數據庫和哪個版本?? ** SQL **只是結構化查詢語言(Structured Query Language) - 許多數據庫系統使用的語言 - SQL是** NOT **數據庫產品......類似這樣的東西通常是供應商特定的 - 所以我們真的需要知道什麼您正在使用的數據庫系統.... – 2012-01-30 09:05:16

回答

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 

加入歷史表回到其自身上,並設置一個條件說沒有後來的歷史行應選擇。使用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每個用戶,例如