我正在使用一个表,对于每个ID,该表都有一个“事件”列表,其中一个事件是该ID所代表的对象是“On”还是“Off”。如果项目不在此表中,则假设项目开始为关闭。如果此时尚未开启,则只能合法地继续使用该项目。
以下是它的外观示例:
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下返回第一行”的逻辑给我带来了很多困难。如果我只想要第一行或第一行,期间,我可以分组并抓住一分钟。但是在这种情况下我该怎么做呢?
答案 0 :(得分: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
实际上不是有效的列名,除非用双引号将其包装起来。我猜这不是真正的专栏名称吗?Off
,但实际上并没有更难:只需将NVL(prev_type, '-')
更改为NVL(prev_type, 'Off')
。id
和"date"
以及不同type
的记录,因为我不知道您希望如何处理。我希望你不要把它们放在任何顺序中,使它们成为可能,因为那将会更加困难。