首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ROW_NUMBER() 搭配 PARTITION BY:單一查詢解決各群組 Top N 問題

     編輯:關於SqlServer

需求

書籍表 `Book` 關聯作者表 `Author`,依 `PublishDate` 遞減,取每位作者最新 5 本書。

建表與測試資料

CREATE TABLE Author (AuthorID INT IDENTITY PK, AuthorName NVARCHAR(50), ...);
CREATE TABLE Book (ID INT IDENTITY, BookName NVARCHAR(35), PublishDate DATETIME, AuthorID INT FK);
-- 插入張三 6 本、王五 2 本、趙四 1 本

單一查詢解法

SELECT * FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY A.AuthorID ORDER BY B.PublishDate DESC) AS RowNum,
        A.AuthorName, B.BookName, B.PublishDate
    FROM Book B INNER JOIN Author A ON A.AuthorID = B.AuthorID
) T
WHERE T.RowNum <= 5;

`PARTITION BY AuthorID` 為每位作者獨立編號,`ORDER BY PublishDate DESC` 依新舊排序,外層篩選 `RowNum <= 5` 即得各組 Top 5。

適用 SQL Server 2005+,免用游標/暫存表,效能佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved