用于将审计跟踪进/出时间转换为位置列表的SQL查询

时间:2013-11-04 15:12:36

标签: sql oracle audit-tables

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

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

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个)。因此,Widget 1是该时期中位置101中唯一的小部件。

2 个答案:

答案 0 :(得分:1)

因此,您需要在期间内每个小部件的最后状态 可能需要subselect语句选择日期之间的所有小部件,按ID分组,按日期desc排序,选择前1,这样你就知道小部件在句点内的最后状态。

根据新条件

更新

  

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

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

答案 1 :(得分: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>> 

here is a sqlfiddle demo(请注意,我稍微更改了数据)