0

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

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

4

3 回答 3

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
于 2013-03-04T15:25:16.663 回答
0

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

对于这个具体的问题,你只需要对JOIN两个表和 GROUPcategory字段,MIN在exp date字段上使用聚合函数即可。如果您可以提供表结构,我们也可以编写查询。

于 2013-03-04T15:26:22.950 回答
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
于 2013-03-04T15:30:07.327 回答