Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Lead Lag по окну  [new]
Кууу
Guest
Не понял, например, есть поле со значениями:
Field1
1
1
1
1
2
2
3
3
3
4

мне надо найти Lead/Lag этого поля но по окну этого же поля, то есть на выходе получить:

Field1	Lead_Field1	lag_Field1
1	2	
1	2	
1	2	
1	2	
2	3	1
2	3	1
3	4	2
3	4	2
3	4	2
4		3
17 фев 09, 12:49    [6828562]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
Кууу
Guest
Пока делаю так:
select Field1, Max(LeadId) over(partition by Field1 order by Field1) LeadId
from
(SELECT  Field1, 
        case when Lead(Field1)  Over(order by Field1)<>
                   Nvl(Lag(Field1)  Over(order by Field1),
                       Lead(Field1)  Over(order by Field1)) then 
        Lead(Field1)  Over(order by Field1)                       
        else Null end LeadId        
FROM  mytable
но это громоздко, вот бы одни запросом
17 фев 09, 13:11    [6828762]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
fy
Guest
Кууу,

Может так:
with t as (
  2  select 1 val from dual union all
  3  select 1 val from dual union all
  4  select 1 val from dual union all
  5  select 1 val from dual union all
  6  select 2 val from dual union all
  7  select 2 val from dual union all
  8  select 3 val from dual union all
  9  select 3 val from dual union all
 10  select 3 val from dual union all
 11  select 4 val from dual )
 12  --
 13  select val, (select min(val) from t b where b.val > a.val) vl1,
 14              (select max(val) from t b where b.val < a.val) vl2 from t a
 15  ;

       VAL        VL1        VL2
---------- ---------- ----------
         1          2 
         1          2 
         1          2 
         1          2 
         2          3          1
         2          3          1
         3          4          2
         3          4          2
         3          4          2
         4                     3
?
17 фев 09, 13:28    [6828910]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
Elic
Member

Откуда:
Сообщений: 29977
Для целочисленных:
with t as (select ceil(level/3) as i from dual connect by level <= 10)
select i, max(i) over (order by i asc  range between unbounded preceding and 1 preceding) as lag_i,
          min(i) over (order by i desc range between unbounded preceding and 1 preceding) as lead_i
  from t
  order by i
;

            I         LAG_I        LEAD_I
------------- ------------- -------------
            1                           2
            1                           2
            1                           2
            2             1             3
            2             1             3
            2             1             3
            3             2             4
            3             2             4
            3             2             4
            4             3

10 rows selected.
17 фев 09, 13:28    [6828915]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
Кууу
Guest
Просто в field1 строковый тип
17 фев 09, 13:32    [6828947]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
Elic
Member

Откуда:
Сообщений: 29977
Кууу
Просто в field1 строковый тип
В следующий раз будешь знать, какой вопрос содержит половину ответа
17 фев 09, 13:37    [6828983]     Ответить | Цитировать Сообщить модератору
 Re: Lead Lag по окну  [new]
Elic
Member

Откуда:
Сообщений: 29977
with t as (select 'x'||power(ceil(level/3), 3) as i from dual connect by level <= 10)
select i, max(lag_i ) over (partition by i) as lag_i,
          max(lead_i) over (partition by i) as lead_i
  from
  ( select i, nullif(lag (i) over (order by i), i) as lag_i,
              nullif(lead(i) over (order by i), i) as lead_i
      from t
  )
  order by i
;

I                                         LAG_I                                     LEAD_I
----------------------------------------- ----------------------------------------- -----------------
x1                                                                                  x27
x1                                                                                  x27
x1                                                                                  x27
x27                                       x1                                        x64
x27                                       x1                                        x64
x27                                       x1                                        x64
x64                                       x27                                       x8
x8                                        x64
x8                                        x64
x8                                        x64

10 rows selected.
17 фев 09, 14:35    [6829511]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить