0

我有一个用于跟踪物理对象位置的数据库,我们称它们为小部件。它有一个审计跟踪表,用于跟踪小部件何时被放置在某个位置,以及它何时离开某个位置(以及之后它去了哪里)。

所以在概念上它看起来像这样

Widget ID   Date           Old Location   New Location
1           01-Oct-2013    NULL           101
1           03-Oct-2013    101            108
1           08-Oct-2013    108            101
2           01-oct-2013    NULL           101
2           02-Oct-2013    101            103
3           12-oct-2013    NULL           101

我希望能够查询在开始日期和结束日期之间位于位置 101 的小部件列表,例如 2013 年 10 月 8 日至 9 日,这应该是小部件 1,而不是小部件 2 或 3。

我不确定如何获得所有这些案例。我可以提取在结束之前移入的小部件列表,以及在开始之前移出的小部件列表,但这也会在小部件 1 离开和返回时消除它。

我想我需要将其转换为带有小部件、位置、进入日期和退出日期的表格,但我不知道该怎么做?

编辑:正如所指出的,我的数据是错误的,我已经更新以将问题排在第 8 到第 9 位(这是第 4 到第 5 位)。因此,小部件 1 是该期间位置 101 中的唯一小部件。

4

2 回答 2

1

尝试这样的事情:

select *
from
(select "Widget ID" id, 
"New Location" loc,
"Date" start_date, 
lead("Date", 1, sysdate) over (partition by "Widget ID" order by "Widget ID") end_date
from widgets) t
where t.loc = 101
and start_date < <<your_ending_date>> and end_date > <<your_starting_date>> 

这是一个 sqlfiddle 演示(注意我稍微改变了你的数据)

于 2013-11-04T16:12:17.853 回答
1

因此,您需要每个小部件在一段时间内的最后状态。
可能需要 subselect 语句来选择日期之间的所有小部件,按 id 对它们进行分组,按日期 desc 排序,选择前 1 个,因此您知道小部件在该期间的最后状态。

根据新条件 更新

我想知道小部件在此期间的任何时间是否都在该位置

您使用不同的 ID 进行选择,并使用 EXISTS 进行子选择,检查当前 ID 和日期在期间和新位置 = X 的行是否出现在结果集中。这将使您知道哪些物品至少存放了 1 次。

于 2013-11-04T15:19:32.490 回答