使用聚合功能查找最新记录

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