如何重复找到给定数字序列的最后一次出现?

时间:2016-03-04 21:38:22

标签: sql oracle

我的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的每次出现。

如何使用查询执行此操作?

3 个答案:

答案 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