Как получить значения для следующей и следующей следующей даты в таблице и внешнего соединения с другой таблицей - PullRequest
0 голосов
/ 25 января 2020

У нас есть таблица tbl со столбцами Alias, Effective_Date, CVal, CPrice и другой таблицей tblA со столбцами Alias ​​и другим столбцом

Как запросить таблицу tbl для возврата значений из этих 2 строк в 1 строки и внешние соединяют его с другой таблицей tblA (объединенной в столбце псевдонимов):

  1. CVal (NextVal) и CPrice (NextPrice) из строки с Effective_Date на следующую дату после somedate

  2. Значения CVal (SecondVal) и CPrice (SecondPrice) из строки с датой Effective_Date на следующую дату после даты Effective_Date от # 1

Например:

Alias   Effective_Date  CVal   CPrice
A       01-JAN-19       1       100
A       01-JAN-20       2       101
A       01-JAN-21       3       102
A       01-JAN-22       4       103

tblA

Alias   OtherColumn
A       O1
B       O2

Say somedate = '31 -DE C -19 '

Ожидаемый результат

(следующая дата после' 31-DE C -19 'в столбце Effective_Date - 01-JAN-20,

, а следующая дата после этого - 01-JAN-21):

Alias   OtherColumn NextVal NextPrice SecondVal SecondPrice
A         O1        2       101       3         102

This Приведенный ниже запрос выдает ошибку «tblA». «ALIAS»: неверный идентификатор

select tblA.*, NextVal, NextPrice, SecondVal, SecondPrice from tblA,
(select t.* from
  (
      lead(CVal, 1) over(order by Effective_Date) as NextVal 
     ,lead(CPrice, 1) over(order by Effective_Date) as NextPrice  
     ,lead(CVal, 2) over(order by Effective_Date) as SecondVal 
     ,lead(CPrice, 2) over(order by Effective_Date) as SecondPrice
     from tbl where Effective_Date >=  '31-DEC-19' and alias = tblA.alias  --> error "tblA"."ALIAS": 
     invalid identifier 
     order by Effective_Date ) t
   where rownum = 1) tblB
 where tblA.alias = tblB.alias(+)

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Попробуйте это:

select t.alias,tblA.othercolumn,t.effective_date,t.nextval,t.nextprice,t.secondval,
t.secondprice from (select 
         Alias,
         effective_date,
          lead(CVal, 1) over(order by Effective_Date) as NextVal 
         ,lead(CPrice, 1) over(order by Effective_Date) as NextPrice  
         ,lead(CVal, 2) over(order by Effective_Date) as SecondVal 
         ,lead(CPrice, 2) over(order by Effective_Date) as SecondPrice
         from tbl A where Effective_Date >=  '31-DEC-19' and exists
         (select * from tblA B where A.alias=B.alias)
    )t join tblA on t.alias=tblA.alias  where rownum<2;

Выход

enter image description here

0 голосов
/ 25 января 2020

Так что я не совсем уверен, почему у вас есть функции управления окнами в подзапросе. Следующее, кажется, получить то, что вы после? (SQL Скрипка здесь )

create table tbl (Alias nchar(1), Effective_Date date, CVal int,   CPrice int);

insert into tbl values ('A', '19-JAN-20', 1, 100);
insert into tbl values ('A', '20-JAN-20', 2, 101);
insert into tbl values ('A', '21-JAN-20', 3, 102);
insert into tbl values ('A', '22-JAN-20', 4, 103);
insert into tbl values ('B', '22-JAN-20', 4, 103);

create table tblA (Alias nchar(1), OtherColumn nchar(2));
insert into tblA values ('A', 'O1');
insert into tblA values ('B', 'O2');


with t as (select 
  tbl.Alias, 
  tbl.Effective_Date, 
  tbl.CVal, 
  tbl.CPrice,
  lead(tbl.Cval, 1) OVER (ORDER BY Effective_Date) as NextVal 
  ,lead(CPrice, 1) over(order by Effective_Date) as NextPrice  
  ,lead(CVal, 2) over(order by Effective_Date) as SecondVal 
  ,lead(CPrice, 2) over(order by Effective_Date) as SecondPrice
  ,rank() over (partition by tbl.Alias order by tbl.Effective_Date) r
from tblA, tbl
where tblA.Alias = tbl.Alias )
select *
from t
  where
  /*Effective_Date >=  '31-DEC-19' AND */
  r = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...