按日期排序的数据集中的最新行

问题描述 投票:0回答:1

希望有人能提供帮助,因为我真的很挣扎。 我有一个包含 ID、PackageName、PostName、DatePosted、DateDelivered 的数据集。 该数据集不断实时更新新数据,但 PackageName 和 PostName 并不唯一。

我正在尝试找到一种选择行的方法,如果 DatePosted 和 DateDelivered 之间的时间差大于某个值,它将返回数据。

问题是,包裹可能有两个条目 DatePosted 和 DateDelivered,这意味着包裹实际上已经送达并且不再迟到,在这种情况下,我不想再报告这个时间差。 但是,因为表中有一个条目表明该包裹was迟到,所以它报告包裹迟到,这是我不希望发生的情况。

我找不到一种方法来仅报告包裹迟到的情况(如果包裹是表中的最后一个 (max(DatePosted)))。

这是我到目前为止所拥有的:

 SELECT    
   'Package Delayed',    
   dd.PackageName,  
   dd.PostName,  
   Max(datediff(ss,dd.DatePosted,isnull(dd.DateDelivered,GETDATE()))) as PackageDelay ,  
   @@SERVERNAME as SentFrom
 FROM       DeliveryDetails as dd 
 inner join dbo.AlertTable as at with (NOLOCK) on dd.PackageName = dd.PackageName  
 and  datediff(ss,dd.DatePosted,isnull(dd.DateDelivered,GETDATE())) >= at.DeliveryThreshold  
 WHERE at.NextAlert < GETDATE()  
 AND at.Active = 1  
 GROUP BY  
 at.SNO,  
 at.AlertEmail,  
 dd.PackageName,  
 dd.PostName

如果包裹曾经延迟,这会给我结果,但我只想要最新发送的包裹延迟时的结果。

任何人都可以帮忙吗,我只是不知道该怎么做?

sql t-sql group-by sql-order-by
1个回答
0
投票

将过滤器应用于 WHERE 子句仅有助于聚合之前的每行数据。添加 HAVING 子句适用于聚合。尝试向该交货日期添加 MAX() 列,如果没有交货日期,聚合将为空。然后添加 HAVING 子句来消除已交付的包:

 SELECT    
   'Package Delayed',    
   dd.PackageName,  
   dd.PostName,  
   Max(datediff(ss,dd.DatePosted,isnull(dd.DateDelivered,GETDATE()))) as PackageDelay ,  
   MAX(DateDelivered) AS DateLastDelivered 
   @@SERVERNAME as SentFrom
 FROM DeliveryDetails as dd 
 inner join dbo.AlertTable as at with (NOLOCK) on dd.PackageName = dd.PackageName  
 and  datediff(ss,dd.DatePosted,isnull(dd.DateDelivered,GETDATE())) >= at.DeliveryThreshold  
 WHERE at.NextAlert < GETDATE()  
 AND at.Active = 1  
 GROUP BY  
 at.SNO,  
 at.AlertEmail,  
 dd.PackageName,  
 dd.PostName  
 HAVING MAX(DeliveredDate) IS NULL

© www.soinside.com 2019 - 2024. All rights reserved.