尝试创建一个返回所有记录的最早日期的查询

时间:2013-03-04 15:20:31

标签: sql sql-server

我有一个SQL Server数据库,我有两个tablesCertificatesCategories。存在一对多关系,每个Certificate可以有多个categories。我正在尝试创建一个查询,该查询将显示数据库中的所有证书,但只返回一个记录,其中包含每个类别的最早exp日期。我查了一篇几乎完全符合我要求的帖子

但是它搜索的记录数量有限。我已经阅读并发现了在其他类型的数据库中执行此操作的不同方法,但在ms sql server中没有有效的方法。

3 个答案:

答案 0 :(得分:2)

为此,您想使用row_number()功能:

select c.*
from (select c.*,
             row_number() over (partition by category order by expdate desc) as seqnum
      from certificates c
     ) c
where seqnum = 1

这适用于SQL Server 2005及更高版本。

在旧版本或Access中,您需要进行连接才能获得此功能:

select c.*
from certifications c join
     (select category, max(expdate) as maxexpdate
      from certifications 
      group by category
     ) csum
     on c.category = csum.category and
        c.expddate = csum.maxexpdate

答案 1 :(得分:0)

在我所知道的大多数数据库中,有一种有效的方法可以解决此类查询,称为JOIN。与PK-FK关系和索引一起,这对于您遇到的大部分目的来说都足够有效。尝试学习这些,你会发现我在说什么。

对于此特定问题,您只需要在类别字段JOINGROUP使用MIN在exp日期字段上使用{{1}}聚合函数。如果您可以提供表结构,我们也可以编写查询。

答案 2 :(得分:0)

以下查询符合需要。

SELECT *
    FROM dbo.Certificates Cert INNER JOIN
    (SELECT CerificateId,MIN(ExpiryDate)
    FROM dbo.Categories
    GROUP BY CerificateId) AS LatestCategories
    ON Cert.CerificateId = LatestCategories.CerificateId