使用聚合功能查詢最新記錄

使用庫資料庫 ,我們嘗試找到為每個作者新增到資料庫的最後一本書。對於這個簡單的例子,我們假設每個新增的記錄總是遞增 Id。

SELECT MostRecentBook.Name, MostRecentBook.Title
FROM ( SELECT Authors.Name,
              Books.Title,
              RANK() OVER (PARTITION BY Authors.Id ORDER BY Books.Id DESC) AS NewestRank
       FROM Authors
       JOIN Books ON Books.AuthorId = Authors.Id
     ) MostRecentBook
WHERE MostRecentBook.NewestRank = 1

可以使用另外兩個函式來代替 RANK。在前面的示例中,結果將是相同的,但是當排序為每個排名提供多行時,它們會給出不同的結果。

  • RANK():重複獲得相同的排名,下一排名考慮前一排名中重複的數量
  • DENSE_RANK():重複獲得相同的排名,下一個排名總是高於前一個排名
  • ROW_NUMBER():將為每一行提供一個獨特的排名,隨機排列重複

例如,如果表具有非唯一列 CreationDate 並且基於此完成排序,則以下查詢:

SELECT Authors.Name,
       Books.Title,
       Books.CreationDate,
       RANK() OVER (PARTITION BY Authors.Id ORDER BY Books.CreationDate DESC) AS RANK,
       DENSE_RANK() OVER (PARTITION BY Authors.Id ORDER BY Books.CreationDate DESC) AS DENSE_RANK,
       ROW_NUMBER() OVER (PARTITION BY Authors.Id ORDER BY Books.CreationDate DESC) AS ROW_NUMBER,
FROM Authors
JOIN Books ON Books.AuthorId = Authors.Id

可能導致:

作者 標題 創立日期 DENSE_RANK ROW_NUMBER
作者 1 書 1 22/07/2016 1 1 1
作者 1 書 2 22/07/2016 1 1 2
作者 1 書 3 21/07/2016 3 2 3
作者 1 書 4 21/07/2016 3 2 4
作者 1 書 5 21/07/2016 3 2
作者 1 書 6 2016 年 4 月 7 日 6 3 6
作者 2 書 7 2016 年 4 月 7 日 1 1 1