2012-10-10 35 views
0
SELECT 
    M.FromUserID, 
    UF.Fname + ' ' + UF.Sname As FullName, 
    UF.URL as Username, 
    Subject, 
    Body, 
    M.Ctime, 
    M.ViewedDate, 
    M.MessageID, 
    M.Starred, 
    M.Deleted, 
    M.ToUserID, 
    (SELECT TOP 1 Fname + ' ' + Sname as FullName FROM user_basics UB WHERE UB.UserID = M.ToUserID) as ToName, 
    (SELECT TOP 1 URL FROM user_basics UB WHERE UB.UserID = M.ToUserID) as ToUserName 
FROM Messages M 
    LEFT JOIN User_Basics UF ON UF.userID = M.FromUserID 
WHERE M.ToUserID = 1433 AND Deleted IS NULL ORDER BY M.Ctime DESC 

我想顯示一個消息歷史與最近的消息首先由用戶名分組...用這個SQL語句按用戶名分組的最佳方式是什麼?

當我用的方法使用該組它告訴我,我需要在所有的其他列添加...

Column 'Messages.FromUserID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

必須有一個更好的辦法?

+1

可能通過使用窗函數,如'ROW_NUMBER()'。一些示例數據會有所幫助。 – podiluska

+0

你想看到什麼數據分組?按用戶名分組意味着您需要爲每個用戶名獲得*單*行,而不是更多。也許你想要的是ORDER BY用戶名? – Arvo

+0

是的,我想查看他們來自哪個人的消息,最近的消息來自頂部。 –

回答

3

使用ROW_NUMBER() OVER (PARTITION BY M.FromUserID ORDER BY M.ViewedDate DESC)

WITH CTE AS 
(
    SELECT 
    M.FromUserID, 
    UF.Fname + ' ' + UF.Sname As FullName, 
    UF.URL as Username, 
    Subject, 
    Body, 
    M.Ctime, 
    M.ViewedDate, 
    M.MessageID, 
    M.Starred, 
    M.Deleted, 
    M.ToUserID, 
    (SELECT TOP 1 Fname + ' ' + Sname as FullName FROM user_basics UB WHERE UB.UserID = M.ToUserID) as ToName, 
    (SELECT TOP 1 URL FROM user_basics UB WHERE UB.UserID = M.ToUserID) as ToUserName, 
    RN = ROW_NUMBER() OVER (PARTITION BY M.FromUserID ORDER BY M.ViewedDate DESC) 
    FROM Messages M 
    LEFT JOIN User_Basics UF ON UF.userID = M.FromUserID 
    WHERE M.ToUserID = 1433 
    AND Deleted IS NULL 
) 
SELECT * FROM CTE 
WHERE RN = 1 
ORDER BY Ctime DESC 
+0

謝謝你,但是這會產生錯誤「沒有列名被指定爲'CTE'的第14列'」 –

+0

@ChrisDowdeswell:對不起,通常我會在列名前加上,而不是附加「AS」。但在這裏我已經忘記了兩者;)(編輯我的答案) –

相關問題