0

从事一个项目,该项目将失败的交付与全新的交付相匹配,并基于haversine公式进行最接近的距离匹配。

目前,我下面的代码让我在 ROUTEID LIKE '%NDD%' 中的每个失败交付与每个新交付 NOT LIKE '%NDD%' (以及其他一些文件夹,但可以忽略)进行一对一匹配

因此,针对 5000 站的 5 次交付为我提供了 25000 种可能性的列表。如果我把它带到 excel 并运行“删除重复项”,中提琴,我有最接近的匹配项,没有重复项。

我怎样才能避免超越并将其缩小到仅 MIN() 匹配?那时,我想把它变成一个更新查询,它将我失败的交付的 ROUTEID 更新为我的新交付中最接近的匹配。

SELECT DISTINCT ORS.PKID, ORS.Reference1, P.ROUTEID, P.SEQUENCE,
    MIN(round(
       ACOS(COS(RADIANS(90-ORS.lat))
     *COS(RADIANS(90-p.latpoint))
     +SIN(RADIANS(90-ORS.lat))
     *SIN(RADIANS(90-p.latpoint))
     *COS(RADIANS(ORS.lon-p.longpoint)))
     *3958.756,2)) 
    AS 'DISTANCE_in_mi'

FROM tblOrderRouteStops AS ORS WITH (NOLOCK)
LEFT JOIN 
     (
         SELECT ORS2.lat AS latpoint, ors2.lon AS longpoint,
             ORS2.Sequence, ORS2.routeid
             from tblOrderRouteStops ORS2 WITH (NOLOCK)
              WHERE ORS2.CUSTID = 180016
              AND ORS2.routeID NOT LIKE '%NDD%'
              AND ORS2.routeID NOT LIKE '%PND%'
              AND ORS2.routeID NOT LIKE '%NFW%'
     ) AS p ON 1=1

WHERE ORS.CustID = 180016
AND ORS.RouteID LIKE '%NDD%'
AND P.RouteID NOT LIKE '%NDD%'
AND P.RouteID NOT LIKE '%PND%'
AND P.RouteID NOT LIKE '%NFW%'

GROUP BY ORS.PKID,ORS.REFERENCE1,P.ROUTEID,P.SEQUENCE

ORDER BY DISTANCE_in_mi
4

1 回答 1

0

APPLY运算符可用于查找外部查询中每一行的最小匹配行。像这样的东西:

select ORS.PKID, ORS.Reference1, P.ROUTEID, P.SEQUENC, p.DISTANCE_in_mi
FROM tblOrderRouteStops AS ORS 
OUTER APPLY
(
    SELECT top 1 ORS.PKID, ORS.Reference1, P.ROUTEID, P.SEQUENCE,
        MIN(round(
           ACOS(COS(RADIANS(90-ORS.lat))
         *COS(RADIANS(90-p.LAT))
         +SIN(RADIANS(90-ORS.lat))
         *SIN(RADIANS(90-p.LAT))
         *COS(RADIANS(ORS.lon-p.lon)))
         *3958.756,2)) 
        AS DISTANCE_in_mi
     FROM tblOrderRouteStops AS P
     WHERE P.CUSTID = 180016
     AND P.routeID NOT LIKE '%NDD%'
     AND P.routeID NOT LIKE '%PND%'
     AND P.routeID NOT LIKE '%NFW%'
     ORDER BY DISTANCE_in_mi 
) p
WHERE ORS2.CUSTID = 180016
AND ORS2.routeID NOT LIKE '%NDD%'
AND ORS2.routeID NOT LIKE '%PND%'
AND ORS2.routeID NOT LIKE '%NFW%'
于 2020-11-28T23:24:12.157 回答