希望有人能提供帮助,因为我真的很挣扎。 我有一个包含 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
如果包裹曾经延迟,这会给我结果,但我只想要最新发送的包裹延迟时的结果。
任何人都可以帮忙吗,我只是不知道该怎么做?
将过滤器应用于 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