我的Oracle数据库中有一个序列,例如:
|Event code | Event time |
|41164 | jan-20-2016 |
|41165 | jan-21-2016 |
|41164 | jan-27-2016 |
|41164 | jan-30-2016 |
|41164 | jan-31-2016 |
|41165 | Feb-01-2016 |
|41164 | Feb-03-2016 |
|41164 | Feb-05-2016 |
|41165 | Feb-01-2016 |
我需要在下一个41165之前直接返回41164的每次出现。
如何使用查询执行此操作?
答案 0 :(得分:2)
Oracle安装程序:
CREATE TABLE Events (Event_code, Event_time ) AS
SELECT 41164, DATE '2016-01-20' FROM DUAL UNION ALL
SELECT 41165, DATE '2016-01-21' FROM DUAL UNION ALL
SELECT 41164, DATE '2016-01-27' FROM DUAL UNION ALL
SELECT 41164, DATE '2016-01-30' FROM DUAL UNION ALL
SELECT 41164, DATE '2016-01-31' FROM DUAL UNION ALL
SELECT 41165, DATE '2016-02-01' FROM DUAL UNION ALL
SELECT 41164, DATE '2016-02-03' FROM DUAL UNION ALL
SELECT 41164, DATE '2016-02-05' FROM DUAL UNION ALL
SELECT 41165, DATE '2016-02-01' FROM DUAL;
查询 - 按提取顺序排序:
SELECT Event_Code,
Event_Time
FROM (
SELECT e.*,
LEAD( Event_Code ) OVER ( ORDER BY ROWID ) as next_code
FROM Events e
)
WHERE Event_Code = 41164
AND Next_Code = 41165;
<强>输出强>:
EVENT_CODE EVENT_TIME
---------- -------------------
41164 2016-01-20 00:00:00
41164 2016-01-31 00:00:00
41164 2016-02-05 00:00:00
查询 - 按日期顺序排序:
SELECT Event_Code,
Event_Time
FROM (
SELECT e.*,
LEAD( Event_Code ) OVER ( ORDER BY Event_Time ) as next_code
FROM Events e
)
WHERE Event_Code = 41164
AND Next_Code = 41165;
<强>输出强>:
EVENT_CODE EVENT_TIME
---------- -------------------
41164 2016-01-20 00:00:00
41164 2016-01-31 00:00:00
答案 1 :(得分:0)
如上所述,要求不明确(例如,如果超过这两个数字,会发生什么?如果在下一个日期你有这两个数字,你需要如何对待它?等等)
您可以从以下SQL开始并进行调整:
select event_code from (
select
event_code,
lead(event_code) over ( order by event_time ) next_event_code
from events )
where event_code < next_event_code;
注意:从内存写入,未经测试
答案 2 :(得分:0)
这已在oracle DB上测试过,您可以在没有数据库的情况下运行它,并检查这是否是您要查找的内容。使用lead分析函数获取结果。
with seq as
(select
41164 a, 'jan-20-2016' b
from dual
union
select
41165 a, 'jan-21-2016' b
from dual
union
select
41164 a, 'jan-27-2016' b
from dual
union
select
41164 a, 'jan-30-2016' b
from dual
union
select
41164 a, 'jan-31-2016' b
from dual
union
select
41165 a, 'Feb-01-2016' b
from dual),
rown as
(select
a, to_date(b,'mon-dd-yyyy') d, b
from seq),
lead as
(select
a, lead(a) over (order by d) c, b from rown)
select
a, c, b
from lead
where
a = 41164 and
c=41165 ;
返回
41164 41165 jan-20-2016
41164 41165 jan-31-2016