【发布时间】:2017-07-20 14:25:22
【问题描述】:
我有一张桌子items,它代表移动的物品。其中,该表具有 PK name、时间戳 creation_time(包含创建条目的时间)和字符串 type(可以是 start、move 或 end 和 @ 987654329@ 条目介于 start 和 end 之间。
表格的一部分可能如下所示:
name creation_time type
_________________________________
i1 2017-03-01 10:00:01 start
i1 2017-03-01 10:00:02 move
i1 2017-03-01 10:00:08 move
i1 2017-03-01 10:00:10 end
i1 2017-03-01 10:00:31 start
i1 2017-03-01 10:00:33 move
i1 2017-03-01 10:00:37 end
我想要得到的是连续时间戳的最大差异,其中第二个时间戳的类型不是start(我不关心end 和start 之间的时间)。
基于this SO question,我提供了以下查询,该查询尚未考虑条目的类型:
select name, creation, next_creation, (next_creation-creation) difference from (
select name, creation, (
select min(creation) from items i2
where i2.name=i.name
and i2.creation > i.creation
) as next_creation
from items i
)
where (next_creation-creation) is not null
order by difference desc
我的问题是我现在不知道如何正确过滤该类型。据我了解,我必须从最里面的查询中获取类型,因为我关心第二个条目的类型,然后将 and type<>'start' 添加到最外面的查询的 where 子句中 - 但我不能得到两个子查询中的值,对吧?
编辑:我期望的结果如下所示:
name creation next_creation difference action
i1 2017-03-01 10:00:02 2017-03-01 10:00:08 6s move
i1 2017-03-01 10:00:33 2017-03-01 10:00:37 4s end
[...]
如您所见,第一个 end 和第二个 start 之间的时间没有条目,这就是要通过过滤类型来完成的。
例如,第一个和最后一个条目之间的时间也没有条目,因为我想要连续条目之间的差异。
【问题讨论】:
-
请告诉我们查询的最终结果应该是什么样子。
-
您需要每个名称值的最大差异吗?