Nehmen wir an, ich habe eine Tabelle Articles
in einer SQL Server 2008-Datenbank mit den Spalten ID INT, Title VARCHAR(100), CatID INT, Posted DATETIME
.
Um die 5 neuesten Artikel für eine bestimmte Kategorie zu erhalten, kann ich dies tun.
SELECT TOP (5) * FROM Articles WHERE CatID = @CatID ORDER BY Posted DESC
Aber was, wenn ich die 5 neuesten Artikel für jede Kategorie haben möchte? Ich weiß, dass ich die obige Abfrage für jede Kategorie wiederholen kann, aber gibt es eine Möglichkeit, eine einzige Abfrage zu machen, die die 5 neuesten Artikel für jede Kategorie zurückgibt?
EDIT。
Hier ist die eigentliche Abfrage, die ich verwende, um die 5 neuesten Artikel mit dem Abschnitt @SectionID zurückzugeben. Nach der aktuellen Terminologie, die ich verwende, ist es der "Abschnitt", nach dem ich gruppiere, nicht die "Kategorie".
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
EDIT 2:
Und hier ist die Anfrage, die ich mir aufgrund der Kommentare hier ausgedacht habe. Scheint gut zu funktionieren.
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