通过Rank链接的SQL()超过

问题描述:

我必须计算容器退出设施的日子,每次容器到达时它都有不同的主键但ID相同。相同的集装箱可以多次出发和抵达,但我当然必须计算最近出发和到达之间的日期。我一直在尝试这样做,使用RANK()函数以上通过计算出发地和目的地:通过Rank链接的SQL()超过

SELECT DISTINCT *, datediff(day,c_out.time_out, c_in.time_In) as Days 
FROM 

(SELECT Container_ID 
, time_out 
, RANK() OVER (PARTITION by Container_ID, order by time_out) as leave_no 
FROM Containers 
WHERE Departure_type='TRUCK'    --EDIT2 ************************************ 
) c_out INNER JOIN 
(SELECT container_ID as Incoming_ID 
, time_in 
,RANK() OVER (PARTITION by Container_ID, order by time_in) as arrive_no 
FROM Containers) c_in 
ON c_out.container_id=c_in.incoming_id 

WHERE c_out.leave_no=c_in.arrive_no+1 

这里的想法是树叶匹配项:如果容器左侧为n个时,接下来的到来将是n + 1

但作为一个结果,我收到类似

CONTAINER_ID TIME_OUT LEAVE_NO INCOMING_ID TIME_IN ARRIVE_NO DAYS 
ABC123   2014-04-11  2  ABC123  2013-11-21 1   -141 

编辑:尽管下面给出的解决方案做的工作,我还是想知道如何加入的RANK()

EDIT2:让我澄清一下:容器具有特别的方式(一些可能一个)

你可以尝试更多的东西蛮力,要离开有点像:

SELECT Container_ID 
, time_out 
, (select min(c2.time_in) 
     from Containers c2 
     where c2.container_ID = c1.container_ID 
     and c2.time_in > c1.time_out) as returned 
FROM Containers c1 
+0

我会告诉你,当服务器将完成它的工作... 10分钟,仍然处理。蛮力是蛮横的。 – Yasskier 2014-09-10 23:56:43

+0

完成了吗? ;-) – Chrisky 2014-09-16 06:07:04

+1

正确索引表后,它变得非常快:) – Yasskier 2014-09-16 07:09:08

尝试所有可能做的排名计算一次:

with cte as (
    SELECT Container_ID 
     , time_out 
     , time_in 
     , RANK() OVER (PARTITION by Container_ID order by time_out) as leave_no 
     , RANK() OVER (PARTITION by Container_ID order by time_in) as arrive_no 
    FROM Containers 
) 
select c_out.container_no 
    , c_out.time_out 
    , c_in.time_in, datediff(day,c_out.time_out, c_in.time_In) 
from cte as c_out 
join cte as c_in 
    on c_out.container_id = c_in.container_id 
    and c_out.leave_no = c_in.arrive_no + 1