Допустим, у меня есть таблица 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