【问题标题】:SQL query to turn audit trail in / out times to list of locationsSQL查询将审计跟踪输入/输出时间转入位置列表
【发布时间】:2013-11-15 06:03:36
【问题描述】:

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

所以概念上看起来像这样

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

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

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

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

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

【问题讨论】:

  • 您想知道小部件是在周期结束时进入还是离开?
  • 我想知道该小部件是否在该期间的任何时间都在该位置
  • 因此,您需要找到至少 1 条记录,其中新位置为 101,日期在期间内 - 对于每个小部件 ID。请检查我的答案中的更新。
  • @PaulHurleyuk,你为什么期望 04-05 Oct 2013 得到 1?如果我理解正确,那么小部件 1 位于位置 101,从 1-oct3-Oct
  • @A.B.Cade,你完全正确,我真的很抱歉!我已将问题改写为要求第 8 到第 9,因此小部件 1 位于该位置。也感谢您的解决方案,我会试一试...

标签: sql oracle audit-tables


【解决方案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(注意我稍微改变了你的数据)

【讨论】:

    【解决方案2】:

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

    更新根据新情况

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

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

    【讨论】:

    • 这就是我要去的地方,但我不需要最后一个状态。在我的问题小部件 1 中的数据中,在此期间没有交易,但在此期间之前移入、移出和移入。我想我需要将行配对,但我不知道该怎么做?
    • 所以您需要在日期之前获取每个小部件的最后状态,对吧?我的意思是,您指定一些“dd-mm-yyyy”,选择此日期之前的所有行并按每个 ID 查看最后的交易。这是你需要的吗?
    • 让我们澄清一下您的问题...您是否需要在一段时间内一直在商店的 itam?或通过 Skype skvoznik 与我联系
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多