2013-11-04 27 views
0

我有一个数据库用于跟踪物理对象的位置,我们称之为小部件。它有一个审计追踪表,追踪widget何时放入某个位置,以及何时离开某个位置(以及之后的位置)。SQL查询将审计线索的输入/输出时间转换为位置列表

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

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,如十月8日至9日到2013年,这应该是小部件1而不是小部件2或3.

我不知道如何获取所有这些情况。我可以提取最后移入的小部件列表,以及在开始之前移出的小部件列表,但这也会消除小部件1在离开和返回时的状态。

我想我需要将它转换为一个表格,包含窗口小部件,位置,入口日期和退出日期,但我不知道该怎么做?

编辑:正如指出的,我的数据是错误的,我已经更新,使问题8日至9日(这是第4至第5)。所以Widget 1是该时期101位置中唯一的小部件。

+0

你想知道小部件进来或期末留? – LINQ2Vodka

+0

我想知道在期间 – PaulHurleyuk

+0

期间任何时候小部件是否在位置。因此,您需要找到至少1条记录,其中新位置是101并且日期在周期内 - 用于每个小部件ID。请在我的答案中检查更新。 – LINQ2Vodka

回答

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(请注意,我改变了你的数据一点点)

1

所以你需要每个小部件在期限内的最后一个状态。
可能需要选择日期之间所有小部件的子选择语句,按id将它们分组,按照Date desc排序,选择top 1,这样就知道小部件在该时间段内的最后一个状态。根据新的条件

我想知道,如果小部件是在位置随时在 期间

你让选择具有独特的ID和一个子查询

UPDATE使用EXISTS检查结果集中是否包含当前ID和日期以及新位置= X的行。这会让你知道哪些物品至少要存放一次。

+0

这就是我到达的地方,但我不需要最后的状态。在我的问题中,小部件1中的数据在此期间没有交易,但是在期间之前移入,移出并返回。我想我需要将这些排配对,但我不知道如何做到这一点? – PaulHurleyuk

+0

所以你需要在日期之前得到每个小部件的最后状态,对吧?我的意思是,你指定了一些“dd-mm-yyyy”,在这个日期之前选择所有行,并通过每个id查看最后的交易。这是你需要的吗? – LINQ2Vodka

+0

让我们来澄清一下你的问题......你需要一段时间内一直在商店里的itams吗?或者通过skype skvoznik与我联系 – LINQ2Vodka