Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to use last_value in multiple tables

Johnny BSep 24 2019 — edited Sep 24 2019

Hi All,

I got helped with similar issue before

Find missing data

Here is my data example using oracle 12c

create table cars(

    myId number,

    carId number,

    carClass number,

    partId number);

   

    insert into cars (myId, carId, carClass, partId)

    values (200, 1, 60, 11);

    insert into cars (myId, carId, carClass, partId)

    values (200, 2, 50, 16);

    insert into cars (myId, carId, carClass, partId)

    values (200, 3, 80, 14);

   

    create table myRates(

    myId  number,

    carId number,

    partId number,

    fy number,

    rate number);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,11,2020,2.3);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,11,2021,2.6);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,14,2020,3.3);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,14,2021,3.2);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,16,2020,1.2);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,1,16,2021,1.9);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,11,2020,2.1);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,11,2021,2.4);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,14,2020,3.1);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,14,2021,3.4);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,16,2020,1.1);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,2,16,2021,1.4);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,11,2020,3.1);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,11,2021,3.4);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,14,2020,3.31);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,14,2021,3.8);

    insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,16,2020,2.1);

     insert into myRates (myId,carId,partId,fy,rate)

    values (200,3,16,2021,2.8);

   

    create table myPerc(

    carId number,

    partId number,

    fy number,

    perc number);

   

    insert into myPerc (carId, partId, fy, perc)

    values (2,11,2020, 50);

    insert into myPerc (carId, partId, fy, perc)

    values (2,11,2021, 100);

    with allYears as(

      select 200 as myId, 2020 + level - 1 fy

      from dual

      connect by level <= 4

      and prior dbms_random.value is not null

    )

    select y.myId, c.carId, c.carClass, c.partId, y.fy

    from allYears y

    left join cars c on c.myId = y.myId  

    order by c.carId, y.fy

The results

 

   MYIDCARIDCARCLASSPARTIDFY
1200160112020
2200160112021
3200160112022
4200160112023
5200250162020
6200250162021
7200250162022
8200250162023
9200380142020
10200380142021
11200380142022
12200380142023

Now when I try to use last_value I get wrong rate values

with allYears as(

      select 200 as myId, 2020 + level - 1 fy

      from dual

      connect by level <= 4

      and prior dbms_random.value is not null

    )

    select y.myId, c.carId, c.carClass, c.partId, y.fy

    ,last_value(r.rate ignore nulls) over (order by r.fy) as rate

    from allYears y

    left join cars c on c.myId = y.myId  

    left join myRates r partition by (r.myId) on r.carId = c.carId and r.partId = c.partId and r.fy = y.fy

    order by c.carId, y.fy

Results

   MYID    CARID    CARCLASS    PARTID    FY    RATE

1    200    1    60    11    2020    3.31

2    200    1    60    11    2021    3.8

3    200    1    60    11    2022    3.8

4    200    1    60    11    2023    3.8

5    200    2    50    16    2020    3.31

6    200    2    50    16    2021    3.8

7    200    2    50    16    2022    3.8

8    200    2    50    16    2023    3.8

9    200    3    80    14    2020    3.31

10    200    3    80    14    2021    3.8

11    200    3    80    14    2022    3.8

12    200    3    80    14    2023    3.8

The correct data should be:

 

   MYIDCARIDCARCLASSPARTIDFYRATEPERC
12001601120202.350
22001601120212.6100
32001601120222.6100
42001601120232.6100
52002501620201.2
62002501620212.1
72002501620222.1
82002501620232.1
92003801420203.31
102003801420213.8
112003801420223.8
122003801420233.8

Any help will be appreciate. Thanks!

This post has been answered by Frank Kulash on Sep 24 2019
Jump to Answer
Comments
Post Details
Added on Sep 24 2019
5 comments
281 views