使用聚合功能查詢最新記錄
使用庫資料庫 ,我們嘗試找到為每個作者新增到資料庫的最後一本書。對於這個簡單的例子,我們假設每個新增的記錄總是遞增 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 |