2015-10-22 26 views
2

我一直無法找出語法來做GROUP BY只顯示每個用戶的最新ups.db_LastUpdate的行(通過db_UserId)。使用GROUP BY僅顯示每個用戶的最新更新行

SELECT up.db_FirstName, up.db_LastName, up.db_UserId, ups.db_Initials, ups.db_LastUpdate 
FROM tblUserProfile up 
    JOIN tblUserSel ups 
     ON ups.db_Code = up.db_UserId 
WHERE ups.db_UserTech = 'U' 

輸出(將有幾百個用戶,但你明白了吧):

Jeff | Ledger | 1-34 | JL | 2015-08-11 
Jeff | Ledger | 1-34 | DBC | 2015-06-06 
Jeff | Ledger | 1-34 | YX | 2015-08-01 
John | Barker | 1-26 | JR | 2015-04-04 
John | Barker | 1-26 | YY | 2015-02-18 
John | Barker | 1-26 | FF | 2015-11-14 

也許像GROUP BY ups.dbUserId, MAX(db_LastUpdate)

感謝您的幫助

+0

GROUP BY whateverColumns,... HAVING MAX(db_LastUpdate) –

回答

7

使用ROW_NUMBER

;WITH CTE AS 
(
    SELECT up.db_FirstName, 
      up.db_LastName, 
      up.db_UserId, 
      ups.db_Initials, 
      ups.db_LastUpdate, 
      RN = ROW_NUMBER() OVER(PARTITION BY up.db_UserId ORDER BY ups.db_LastUpdate DESC) 
    FROM tblUserProfile up 
    INNER JOIN tblUserSel ups 
      ON ups.db_Code = up.db_UserId 
    WHERE ups.db_UserTech = 'U' 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 

正如在評論中指出,可以使用MAX,然後用你的表連接:

;WITH CTE AS 
(
    SELECT up.db_UserId, 
      MAX(ups.db_LastUpdate) MaxLastUpdate 
    FROM tblUserProfile up 
    INNER JOIN tblUserSel ups 
      ON ups.db_Code = up.db_UserId 
    WHERE ups.db_UserTech = 'U' 
    GROUP BY up.db_UserId 
) 
SELECT B.* 
FROM CTE A 
INNER JOIN tblUserSel B 
    ON A.db_UserId = B.db_Code 
    AND A.MaxLastUpdate = B.db_LastUpdate; 

但是你要知道,如果存在一個行具有相同的日期爲同一個用戶,你會得到那些2行。

+1

你是否認爲這將是有益的補充MAX()'解決方案以及顯示其他選項? – Zane

+0

@ Zane好了,好的,我在答案中加入了這個選項 – Lamak

+0

你和你的CTE :) – Zane

0

如果你的表有一個唯一的ID列,我一般處理這種情況是這樣的:

WITH LastEdit AS (
    SELECT ups.db_Code, ups.db_Initials, ups.db_LastUpdate 
    FROM tblUserSel ups 
    WHERE ups.db_UserTech = 'U' AND ups.ID = (
     SELECT TOP 1 ID 
     FROM tblUserSel upsn 
     WHERE ups.db_Initials = upsn.db_Initials 
     ORDER BY upsn.db_LastUpdate DESC 
    ) 
) 
SELECT up.db_FirstName, up.db_LastName, up.db_UserId, le.db_Initials, le.db_LastUpdate 
FROM tblUserProfile up 
    INNER JOIN LastEdit le 
     ON le.db_Code = up.db_UserId