0

我正在使用一个表,对于每个 ID,都有一个“事件”列表,其中事件是该 ID 表示的对象是“打开”还是“关闭”。如果项目不在此表中,则假定它们开始时是关闭的。一个项目只有在当时没有打开的情况下才能合法地继续。

这是它可能看起来的示例:

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUN-12
1    On      05-JUN-12

不幸的是,这个数据很糟糕,而且充满了不可能。以下是该表的实际部分:

Events
ID   Type    Date
1    On      01-MAY-12
1    On      01-MAY-12
1    On      01-JUN-12
1    Off     01-JUL-12
1    Off     01-AUG-12
1    On      05-AUG-12

我想要做的是编写一个查询,该查询返回该表而没有垃圾数据,其中不可能的行(即,当它已经打开时打开项目的行,或者当它已经关闭时关闭的行)被删除。

我不太关心它在第一次打开之前“关闭”的情况,因为我不相信我们有任何这样的情况。

因此,所述查询将返回:

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUL-12
1    On      01-AUG-12

关于如何做到这一点的任何想法?这种“在条件X下返回第一行”的逻辑给我带来了很大的困难。如果我只想要第一排或第一排,期间,我可以分组并抓住一分钟。但是在这种情况下我该怎么做呢?

4

1 回答 1

5

你可以这样写:

SELECT id,
       type,
       "date"
  FROM ( SELECT id,
                LAG(type) OVER (PARTITION BY id ORDER BY "date") AS prev_type,
                type,
                "date"
           FROM events
       )
 WHERE type <> NVL(prev_type, '-')
 ORDER
    BY "date"
;

笔记:

  • date除非您将其用双引号括起来,否则它实际上不是有效的列名。我猜这不是真正的专栏名称?
  • 你写道,“我不太关心它在第一次打开之前‘关闭’的情况,因为我不相信我们有任何这样的情况”,所以我决定删除首字母Offs ,但这实际上并不难:只需更改NVL(prev_type, '-')NVL(prev_type, 'Off').
  • 我不担心您有两个具有相同和不同 s 的记录的情况id"date"因为type我不知道您希望如何处理。我希望您不需要将它们放在任何可能的顺序中,因为这将更加困难。
于 2012-09-10T18:50:12.687 回答