计算两列组合的差异时间

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

我需要计算卡车从一个车站到另一个车站所需的时间。我想在我的数据集中选择任何起点和终点,并计算所有卡车花费的平均时间。

这就是数据的样子:

卡车号码 起源 目的地 出发 到达
1 A 01-01-2022 05-01-2022
1 C 10-01-2022 15-01-2022
1 C D 16-01-2022 20-01-2022
1 D E 20-01-2022 22-01-2022
2 A 15-01-2022 25-01-2022

我们需要获取从起点到终点的所有组合,以用于特定起点的下一个 X 目的地。如果它可以有一个变量那就太好了,这样我们就可以设置我们想要以下 X 个目的地。在这个例子中它将是 x=3 因为我们计算了 A 和 B C D 而不是 AE 之间的差异:

卡车号码 起源 目的地 运输时间
1 A 5天
1 A C 15天
1 A D 20天
1 C 5天
1 D 10天
1 E 12天
1 C D 4天
1 C E 6天
2 A 10天

主要问题是如何计算未来 x 站的所有组合。

sql sql-server combinations common-table-expression cross-join
2个回答
0
投票
select 
      origin, destination, avg(datediff(day, Departure, Arrival))
from data
GROUP BY origin, destination

如果要将卡车编号保留在卡车级别,请将卡车编号放在选择中并删除聚合。

我提出了上面的建议,因为您可能希望获得从 A->B 然后 B->C 的平均时间,作为组件,然后 A->C 作为汇总。

你可以用领先/滞后来寻找下一个起点等于先前的目的地......


0
投票

我做了一些假设。首先,路线只在一个方向上,即A->B->C->D。第二,车号唯一,不跳号。第三,出发地和目的地总是按字母顺序排列的。

因此,第一步是创建一个包含所有可能的起点/终点排列的表格。这是通过 Cross Join 和一个 While 循环来遍历卡车/起点/终点来完成的。同时,我计算了每个排列之间的传输时间。

接下来是 X 站。这就是 Row_Number 的用武之地。按原样进行分区和排序,您可以简单地选择小于或等于 X 停靠点数 (@Destinations) 的所有内容。如果您将 @Destinations 设置为大于 ResultsTable 中的数字,它将只返回整个表。如果你将它设置为 0 或 NULL,它什么都不返回。

最后,在您的预期结果中,您对运输时间有两种不同的计算。 A>B 是 5 天,但前提是您同时计算出发和到达。 B>C 是 5 天,但前提是您不计算两者。我两个都算了。如果你只想数一个,把Transit计算中的+1去掉。

小提琴

DECLARE @Destinations INT = 3
DECLARE @Truck INT = 0
DECLARE @maxTruck INT
DECLARE @ResultTable TABLE 
           (rn INT, TruckNumber INT, Origin CHAR, Destination CHAR, Transit VARCHAR(10));

SELECT @maxTruck = MAX(TruckNumber)
  FROM trips;

WHILE @Truck <= @maxTruck
   BEGIN
       INSERT INTO @ResultTable (rn, TruckNumber, Origin, Destination, Transit)
         SELECT 
           DISTINCT ROW_NUMBER() OVER (PARTITION BY t1.TruckNumber, t1.origin ORDER BY t1.origin, t2.Destination) AS rn,
                    t1.TruckNumber,
                    t1.Origin, 
                    t2.Destination, 
                    DATEDIFF(DAY, t1.departure, t2.Arrival )+ 1 AS Transit
               FROM trips t1
         CROSS JOIN trips t2
              WHERE t2.destination > t1.origin
                AND t1.TruckNumber = @Truck and t2.TruckNumber = @Truck
   SET @Truck = @Truck + 1   
   END

SELECT --rn, 
       TruckNumber,
       Origin,
       Destination,
       CONCAT(Transit, ' Days') Transit
  FROM @ResultTable
 WHERE rn <= @Destinations
 ORDER BY TruckNumber,Origin,Destination

@Destinations = 3 返回:

卡车号码 起源 目的地 中转
1 A 5天
1 A C 15天
1 A D 20天
1 C 6天
1 D 11天
1 E 13天
1 C D 5天
1 C E 7天
1 D E 3天
2 A 11天
© www.soinside.com 2019 - 2024. All rights reserved.