3 Stimmen

Die 5 neuesten Artikel für jede Kategorie in MS SQL Server anzeigen

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

4voto

Quassnoi Punkte 396418
SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY CatId ORDER BY Posted DESC) AS rn
        FROM    Articles
        ) q
WHERE   rn <= 5

3voto

SQLMenace Punkte 128184

Versuchen Sie dies

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

SELECT * FROM CTE WHERE Rownum <= 5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X