如何筛选仅最新投递的超时包裹数据?SQL查询优化求助
优化SQL查询:仅返回包裹最新投递记录超时的结果
问题分析
原查询会返回所有曾出现超时的包裹记录,无法过滤掉历史超时但最新记录正常的情况。我们需要只筛选每个包裹(按PackageName+PostName组合标识)的最新投递记录(max(DatePosted))超时的条目。
优化后的查询语句
WITH LatestDelivery AS ( -- 先获取每个PackageName+PostName的最新投递时间 SELECT PackageName, PostName, MAX(DatePosted) AS LatestPostDate FROM DeliveryDetails GROUP BY PackageName, PostName ) SELECT 'Package Delayed' AS AlertType, dd.PackageName, dd.PostName, DATEDIFF(ss, dd.DatePosted, ISNULL(dd.DateDelivered, GETDATE())) AS PackageDelay, @@SERVERNAME AS SentFrom FROM DeliveryDetails AS dd -- 关联最新投递记录,拿到对应的数据行 INNER JOIN LatestDelivery AS ld ON dd.PackageName = ld.PackageName AND dd.PostName = ld.PostName AND dd.DatePosted = ld.LatestPostDate -- 关联告警配置表,修正原查询中无效的join条件 INNER JOIN dbo.AlertTable AS at WITH (NOLOCK) ON dd.PackageName = at.PackageName AND DATEDIFF(ss, dd.DatePosted, ISNULL(dd.DateDelivered, GETDATE())) >= at.DeliveryThreshold WHERE at.NextAlert < GETDATE() AND at.Active = 1
关键优化点
- 用CTE
LatestDelivery锁定每个包裹的最新投递时间,确保后续只处理最新记录 - 修正原查询中无效的关联条件(原
dd.PackageName = dd.PackageName属于无意义自关联,改为关联AlertTable对应字段) - 直接计算最新记录的超时时长,无需
MAX()聚合(已定位到单条最新记录) - 仅保留最新投递记录超时的包裹,彻底排除历史超时记录干扰
内容的提问来源于stack exchange,提问作者sicosimatic
相关产品推荐
相关产品推荐

