SQL:从Select语句

时间:2018-06-07 06:31:56

标签: sql sql-server

我希望有人可以帮助解决这个问题。 MIN()函数没有按预期工作,可能是因为我需要在某处有一个JOIN,但我没有尝试过任何联接。我找到的任何示例如SQL: Select most recent date for each category都是基本的,并且不包含多行,这些行在某些列上具有匹配的条目,或者从多个表中进行选择。

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的多个ArrivalDates,当我想要的是每个DockId的下一个到达日期而不是将来的日期。如果我从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  

1 个答案:

答案 0 :(得分:1)

如果您在group by语句中添加FreightCode,显然它会为每个FreightCode提供结果。如果我错了,请纠正我,你希望FreightCode对应于每个truckno和min到达日期。为此,试试这个:

SELECT bp.id, COALESCE(t.data_od_t, 'NIE') AS "313"
FROM bp_produkt bp
LEFT JOIN LATERAL (select to_char(data_od, 'YYYY-MM-DD') AS data_od_t 
                   from bp_stan_produkt 
                   where id_produkt = bp.id 
                     and data_do is null
                     and id_stan_produkt = 313) t 
 ON TRUE
WHERE bp.id in(21048528)

如有任何澄清,请通知我。