Помогите с запрос, сложная связь данных

гость022007
Дата: 25.02.2007 20:37:30
Есть таблица прибытия автомобилей
key   key_auto   arrival      ....
1        1      01.01.07   ....
2        2      10.01.07   ....
3        1      02.02.07   ....
4        1      04.02.07   ....
5        2      15.02.07   ....
необходимо получить результат за месяц:
key_auto   arrival    arrival_last ....
   1       02.02.07   01.01.07
   1       04.02.07   02.01.07
   2       15.02.07   10.01.07
пытаюсь сделать это следующим образом
select a.key_auto, a.arraival, alast.arrival, alast....
 from auto a,
       auto alast
  where
     a.arrival between to_date('01.02.2007') and to_date('28.02.2007') and
     alast.key = (select max(tmp.key)
                         from auto tmp
                           where tmp.arrival<a.arrival and tmp.key_auto=a.key_auto
                     )
Проблема в том, что поле arrival (прибытие) редактируемое, при этом связка max(tmp.key) не работает, так как key может быть и max, а вот arrival нет. Делать через max(arrival) тоже не катит, т.к. авто может быть несколько раз за день, и подзапрос будет возвращать несколько строк, что приведет к ошибке. А если авто первый раз прибыл, то в текущему запросу я его и вовсе не увижу. Как поступить в такой ситуации?
SY
Дата: 25.02.2007 21:20:42
Not exactly sure what you need, but looks like:

select  key_auto,
        arrival,
        arrival_last
  from  (
         select  key_auto,
                 arrival,
                 lag(arrival) over(partition by key_auto order by arrival) arrival_last
           from  auto
        )
  where arrival between to_date('01.02.2007') and to_date('28.02.2007')
/

SY.
Volder
Дата: 25.02.2007 21:39:52
SY
Not exactly sure what you need, but looks like:


по-моему то, что надо))

with t as (select 1 key, 1 key_auto, to_date('01.01.2007','dd.mm.yyyy') arrival from dual union all
           select 2 key, 2 key_auto, to_date('10.01.2007','dd.mm.yyyy') arrival from dual union all
           select 3 key, 1 key_auto, to_date('02.02.2007','dd.mm.yyyy') arrival from dual union all
           select 4 key, 1 key_auto, to_date('04.02.2007','dd.mm.yyyy') arrival from dual union all
           select 5 key, 2 key_auto, to_date('15.02.2007','dd.mm.yyyy') arrival from dual)
           
select * from (select key_auto, arrival, lag(arrival) over (partition by key_auto order by key_auto) arrival_last from t)
 where arrival_last is not null
Volder
Дата: 25.02.2007 21:44:38
Volder

 ...order by arrival...

конечно же..
dmidek
Дата: 25.02.2007 22:05:11
Volder
SY
Not exactly sure what you need, but looks like:


по-моему то, что надо))

with t as (select 1 key, 1 key_auto, to_date('01.01.2007','dd.mm.yyyy') arrival from dual union all
           select 2 key, 2 key_auto, to_date('10.01.2007','dd.mm.yyyy') arrival from dual union all
           select 3 key, 1 key_auto, to_date('02.02.2007','dd.mm.yyyy') arrival from dual union all
           select 4 key, 1 key_auto, to_date('04.02.2007','dd.mm.yyyy') arrival from dual union all
           select 5 key, 2 key_auto, to_date('15.02.2007','dd.mm.yyyy') arrival from dual)
           
select * from (select key_auto, arrival, lag(arrival) over (partition by key_auto order by key_auto) arrival_last from t)
 where arrival_last is not null


Магия исходных данных ?
А если например в январе будет две записи по key_auto...
Про март я уж и не говорю ...