转换状态中的日志表天数

dee*_*ee1 2 oracle optimization

这是简化的,但代表了我试图解决的问题。我们有一个包含 5-1000 万行的表格,其格式类似于以下内容...

Input Table
Date    Item   Moved to Box
Oct-1   1      BoxA 
Oct-6   1      BoxB
Oct-8   1      BoxC
Oct-9   1      BoxB
Oct-16  1      BoxC
Oct-17  1      BoxD
Run Code Online (Sandbox Code Playgroud)

我正试图把它转换成这个

Expected Output
Item    Box    Duration
1       BoxA   5
1       BoxB   9
1       BoxC   2
1       BoxD   *unimportant
Run Code Online (Sandbox Code Playgroud)

*查询返回的内容无关紧要BoxD(唯一的框移入而没有框移出),因为它被丢弃了。

对于示例,希望您可以看到输入表表示一个项目何时从一个盒子移动到另一个盒子的日志,并且预期输出是每个项目在每个盒子中花费的累积时间。

我的第一个想法是做一个表与自身的连接,并为每条记录做一些日期最小/最大,以尝试从框中找到退出日期,然后对结果求和,但这似乎是一个非常密集的过程。

有人将如何以有效的方式解决这个问题?

a_h*_*ame 5

select item, 
       sum(duration),
       moved_to
from (
  select item, 
         lead(move_date)  over (partition by item order by move_date) - move_date as duration,
         moved_to
  from movement         
) t
group by item, moved_to
order by item, moved_to;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 示例:http ://www.sqlfiddle.com/#!4/dff2c /1