首页 > 解决方案 > SQL:从 Select 语句中过滤最近的日期条目

问题描述

我希望有人可以帮助解决这个问题。MIN() 函数没有按预期工作,可能是因为我需要在某个地方有一个 JOIN,但我尝试过的所有连接都没有工作。我发现的任何示例,例如SQL:为每个类别选择最近的日期只是基本的,并且不包括在某些列上具有匹配条目的多行或从多个表中进行选择。

SELECT TruckNo, MIN(ArrivalDate) AS ArrivalDate, DockId, FreightCode
FROM tblTruckArrival  
WHERE ArrivalDate <> '' AND DockId IN (660,517,86,9,253,685)  
GROUP BY TruckNo, DockId, FreightCode  
ORDER BY TruckNo  

当我想要的是每个 DockId 的下一个到达日期而不是未来日期时,这会返回类似这些结果的结果,其中包括每个 DockId 的多个 ArrivalDates。如果我从 Select 语句中删除 FreightCode,我会得到正确的结果(可能是因为某些条目对相同的 DockId 有不同的 FreightCode),但我需要知道返回的每一行的 FreightCode 是什么。

TruckNo         ArrivalDate     DockId  FreightCode  
22              2018-07-13      253     03WS18  
22              2018-08-29      253     04WS18  
22              2018-10-16      253     05WS18  
22              2018-12-03      253     06WS27  
23              2018-09-02       86     808ES  
23              2018-09-12      685     808ES  
24              2018-11-24       86     810ES  
25              2018-06-17       86     805ES  
25              2018-06-28      517     805ES  
25              2018-12-04      517     810ES  
26              2018-07-03        9     805ES  
27              2018-07-13       86     806ES  

应该返回这个:

TruckNo         ArrivalDate     DockId  FreightCode  
22              2018-07-13      253     03WS18  
23              2018-09-02       86     808ES  
23              2018-09-12      685     808ES  
24              2018-11-24       86     810ES  
25              2018-06-17       86     805ES  
25              2018-06-28      517     805ES  
26              2018-07-03        9     805ES  
27              2018-07-13       86     806ES  

标签: sqlsql-server

解决方案


If you add FreightCode in group by statement, obviously it will give results basis every FreightCode. Correct me if I am wrong, you want the FreightCode corresponding to the each truckno and min arrival date. For that try this out:

select a.*,b.freightcode  
from
(select truckno, dockid, min(arrivaldate) as arrivaldate
from tbltruckarrival
where arrivaldate <> '' and dockid in (660,517,86,9,253,685)
group by truckno, dockid) a
left join
tbltruckarrival b
on a.truckno = b.truckno and a.arrivaldate = b.arrivaldate and a.docket_id = b.docket_id
order by a.truckno

Let me know in case of any clarifications.


推荐阅读