Oracle SQL - 使用"不可能"的日期范围修复数据

Jer*_*emy 0 sql oracle group-by

我正在使用一个表,对于每个ID,它都有一个"事件"列表,其中一个事件是该ID所代表的对象是否为"On"或"Off".如果项目不在此表中,则假设项目开始为关闭.只有在该点没有开启的情况下,物品才能合法地继续使用.

以下是它的外观示例:

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUN-12
1    On      05-JUN-12
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些数据非常糟糕,并且充满了不可能性.以下是此表的实际部分:

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
Run Code Online (Sandbox Code Playgroud)

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

我不太关心它在第一次打开之前被"关闭"的情况,因为我不相信我们有任何这种情况.

所以,所述查询将返回:

Events
ID   Type    Date
1    On      01-MAY-12
1    Off     01-JUL-12
1    On      01-AUG-12
Run Code Online (Sandbox Code Playgroud)

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

rua*_*akh 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"
;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • date除非用双引号括起来,否则它实际上不是有效的列名.我猜这不是真正的专栏名称?
  • 你写道,"我不太关心它在第一次打开之前'关闭'的情况,因为我不相信我们有任何这种情况",所以我决定删除初始Off的,但这实际上并不难:只需NVL(prev_type, '-')改为NVL(prev_type, 'Off').
  • 我不担心,你有两个记录有相同的情况id,并"date"与不同的typeS,因为我不知道你怎么想的是处理.我希望你不要把它们放在任何顺序 - 使它们成为可能,因为这将是非常困难的.