使用聚合功能查找最新记录
使用库数据库 ,我们尝试找到为每个作者添加到数据库的最后一本书。对于这个简单的例子,我们假设每个添加的记录总是递增 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 |