我需要计算卡车从一个车站到另一个车站所需的时间。我想在我的数据集中选择任何起点和终点,并计算所有卡车花费的平均时间。
这就是数据的样子:
卡车号码 | 起源 | 目的地 | 出发 | 到达 |
---|---|---|---|---|
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 站的所有组合。
select
origin, destination, avg(datediff(day, Departure, Arrival))
from data
GROUP BY origin, destination
如果要将卡车编号保留在卡车级别,请将卡车编号放在选择中并删除聚合。
我提出了上面的建议,因为您可能希望获得从 A->B 然后 B->C 的平均时间,作为组件,然后 A->C 作为汇总。
你可以用领先/滞后来寻找下一个起点等于先前的目的地......
我做了一些假设。首先,路线只在一个方向上,即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天 |