我有一个SQL Server
数据库,我有两个tables
,Certificates
和Categories
。存在一对多关系,每个Certificate
可以有多个categories
。我正在尝试创建一个查询,该查询将显示数据库中的所有证书,但只返回一个记录,其中包含每个类别的最早exp日期。我查了一篇几乎完全符合我要求的帖子
但是它搜索的记录数量有限。我已经阅读并发现了在其他类型的数据库中执行此操作的不同方法,但在ms sql server中没有有效的方法。
答案 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关系和索引一起,这对于您遇到的大部分目的来说都足够有效。尝试学习这些,你会发现我在说什么。
对于此特定问题,您只需要在类别字段JOIN
上GROUP
使用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