2010-04-25 48 views
2

對於涉及3個表格的查詢,我遇到了實際困難。我需要按部門名稱對每個部門的3個最新用戶進行分組。這些組應該由users.dateadded進行排序,因此具有最新活動的部門是第一個。用戶可以存在於多個部門,所以我使用一個只包含用戶ID和deptID的查找表。我的表格如下。SQL 2005:選擇排名前N,加入ID分組

- DEPID |名

用戶 - 用戶ID |名稱| dateadded

DepUsers - DEPID |用戶ID

我需要的產出將是

收貨
李四 - 2010年4月23日
比爾·史密斯 - 2010年4月22日

會計
史蒂夫·瓊斯 - 2010年4月22日
李四 - 4/21/2010

審計
史蒂夫·瓊斯 - 4/21/2010
比爾·史密斯 - 4/21/2010

+0

糟糕!忘了說謝謝! :) 太粗魯了! – 2010-04-25 19:14:01

+0

也許我需要將更新日期添加到我的depusers表中? – 2010-04-25 19:31:39

回答

2

這應該給你爲每個部門最後3添加的用戶(使在SQL 2005年使用新的ROW_NUMBER功能):

select * from (select D.name, U.name, U.dateadded, ROW_NUMBER() over (PARTITION BY D.depID ORDER BY U.dateadded DESC) as ROWID from Department as D 
join DepUsers as DU on DU.depID = D.depID 
join Users as U on U.userID = DU.userID) as T 
where T.ROWID <= 3 

我沒有完全明白你怎麼想的輸出看,但我想這個結果設置爲您提供了一個開始,讓您領先。

+0

我收到一個錯誤,說ROWID不存在。應該在子查詢中嗎? – 2010-04-25 20:12:25

+0

打我吧!看起來我們都在類似的軌道上。 – BradBrening 2010-04-25 20:13:11

+0

@Suzy嘗試用(QUERY)中的select *敲擊整個ting,並將where子句移出子查詢,該工作應該有效(btw。由於我在where子句中有錯誤,所以我更新了我的帖子) – ntziolis 2010-04-25 20:20:57

1

試試這個:

WITH CTE AS 
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY DepartmentName ORDER BY DateAdded DESC) AS RowNumber 
    ,D.name AS DepartmentName 
    ,U.name AS UserName 
    ,U.dateadded AS DateAdded 
FROM 
    DepUsers DU 
INNER JOIN Users U 
    ON DU.userID = U.userID 
INNER JOIN Department D 
    ON DU.depID = D.depID 
) 
SELECT 
    DepartmentName 
    ,UserName 
    ,DateAdded 
FROM CTE 
WHERE RowNumber <= 3 
ORDER BY DepartmentName, DateAdded DESC 
+0

我在CTE的用戶有一個壞的別名。更正 – BradBrening 2010-04-25 20:17:41