首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在尝试创建返回所有记录的最旧日期的查询

正在尝试创建返回所有记录的最旧日期的查询
EN

Stack Overflow用户
提问于 2013-03-04 23:20:31
回答 3查看 91关注 0票数 0

我有一个SQL Server数据库和两个tablesCertificatesCategories。这是一对多的关系,每个Certificate可以有多个categories。我正在尝试创建一个查询,该查询将显示数据库中的所有证书,但只返回每个类别的最早exp日期的一条记录。我查了一篇文章,它几乎和我想要的一模一样

但是它搜索的记录数量是有限的。我在其他类型的数据库中找到了不同的方法来做到这一点,但在ms sql server中没有有效的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-04 23:26:23

据我所知,在大多数数据库中有一种有效的方法来解决这类查询,称为JOIN。再加上PK-FK关系和索引,对于您遇到的大多数目的来说,这将是足够有效的。试着学习这些,你就会发现我在说什么。

对于这个特定的问题,您只需要在category字段上使用MIN聚合函数JOIN GROUP这两个表。如果你能提供表的结构,我们也许也能写出查询。

票数 0
EN

Stack Overflow用户

发布于 2013-03-04 23:25:17

为此,您需要使用row_number()函数:

代码语言:javascript
复制
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中,您需要执行联接才能获得以下内容:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2013-03-04 23:30:07

下面的查询将满足需要。

代码语言:javascript
复制
SELECT *
    FROM dbo.Certificates Cert INNER JOIN
    (SELECT CerificateId,MIN(ExpiryDate)
    FROM dbo.Categories
    GROUP BY CerificateId) AS LatestCategories
    ON Cert.CerificateId = LatestCategories.CerificateId
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15204894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档