我正在尝试为SQL Server 2005写一个查询,但是我不知道该怎么做。我有一个包含以下字段的表:

MessageID int
CategoryID int
优先tinyint
MessageText NVARCHAR(MAX)


我需要一个查询,该查询将为Category中具有最高优先级的每一行返回*。例如,如果我有以下数据:

MessageID,类别ID,优先级,MessageText
1,100,1,错误#1234
2,100,2,错误#243
3,100,3,发生错误#976
4,200,4,错误#194
5,200,1,错误#736
6,300,3,发生错误#54
7,300,2,错误#888

那么结果将是:

MessageID,类别ID,优先级,MessageText
3,100,3,发生错误#976
4,200,4,错误#194
6,300,3,发生错误#54

请注意,它为每个类别返回一行,并且是该类别具有最高优先级的行。

谁能告诉我如何编写此查询?

最佳答案

已验证:

SELECT
    highest_priority_messages.*
FROM
(
    SELECT
    m.MessageID
    , m.CategoryID
    , m.Priority
    , m.MessageText
    , Rank() OVER
        (PARTITION BY m.CategoryID ORDER BY m.Priority DESC) AS p_rank
    FROM [Message] m
    GROUP BY
        m.CategoryID
        , m.Priority
        , m.MessageID
        , m.MessageText
) highest_priority_messages
WHERE
    p_rank = 1

10-08 16:43