Вернуть 5 новейших статей для каждой категории в MS SQL Server - PullRequest
3 голосов
/ 18 марта 2011

Допустим, у меня есть таблица Articles в базе данных SQL Server 2008 со столбцами ID INT, Title VARCHAR(100), CatID INT, Posted DATETIME.

Чтобы получить 5 новейших статей для определенной категории, я могу сделать это.

SELECT TOP (5) * FROM Articles WHERE CatID = @CatID ORDER BY Posted DESC

Но что, если я хочу 5 самых новых статей для каждой категории? Я знаю, что могу повторить запрос выше для каждой категории, но есть ли способ сделать один запрос, который вернет 5 новейших статей для каждой категории?

EDIT:

Вот фактический запрос, который я использую, чтобы вернуть 5 новейших статей с разделом @SectionID. В соответствии с фактической терминологией, которую я использую, это группировка по разделу, а не по категории.

SELECT TOP (5) *
FROM Article
    INNER JOIN Subcategory on Article.ArtSubcategoryID = Subcategory.SubID
    INNER JOIN Category on Subcategory.SubCatID = Category.CatID
    INNER JOIN section ON Category.CatSectionID = Section.SecID
WHERE (Section.SecID = @SectionID)
ORDER BY Article.ArtUpdated DESC

РЕДАКТИРОВАТЬ 2:

И вот запрос, который я придумал, основываясь на комментариях здесь. Кажется, работает хорошо.

SELECT  *
FROM (
    SELECT Article.*,
        ROW_NUMBER() OVER (PARTITION BY SecID ORDER BY ArtUpdated DESC) AS rn
    FROM Article
        INNER JOIN Subcategory on Article.ArtSubcategoryID = Subcategory.SubID
        INNER JOIN Category on Subcategory.SubCatID = Category.CatID
        INNER JOIN section ON Category.CatSectionID = Section.SecID
) q
WHERE rn <= 5

Ответы [ 2 ]

4 голосов
/ 18 марта 2011
SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY CatId ORDER BY Posted DESC) AS rn
        FROM    Articles
        ) q
WHERE   rn <= 5
3 голосов
/ 18 марта 2011

Попробуйте это

;WITH CTE AS (SELECT ROW_NUMBER() OVER(PARTITION BY CatID ORDER BY Posted DESC) 
AS Rownum,*
FROM Articles )

SELECT * FROM CTE WHERE Rownum <= 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...