我有一个数据库,用于跟踪物理对象的位置,让我们称之为小部件。它有一个审计跟踪表,用于跟踪窗口小部件放置在某个位置的时间,以及何时离开某个位置(以及它之后的位置)。
所以概念上它看起来像这样
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中唯一的小部件。答案 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(请注意,我稍微更改了数据)