Reputation: 310
I have the following tables in Oracle SQL 19:
Ranking Table:
+--------------+--------------+--------------+
| Team Ranking | Team | Ranking Date |
+--------------+--------------+--------------+
| 2 | FC Barcelona | 15-Jul-20 |
| 5 | FC Barcelona | 25-Jul-20 |
| 4 | FC Barcelona | 29-Jul-20 |
| 1 | Real Madrid | 15-Jul-20 |
| 7 | Real Madrid | 20-Jul-20 |
| 3 | Real Madrid | 22-Jul-20 |
| 1 | Real Madrid | 29-Jul-20 |
+--------------+--------------+--------------+
Player Table:
+--------------------+--------------+------------------+
| Player | Team | Player Join Date |
+--------------------+--------------+------------------+
| Lionel Messi | FC Barcelona | 15-Jul-20 |
| Luis Suarez | FC Barcelona | 15-Jul-20 |
| Antoine Griezmann | FC Barcelona | 15-Jul-20 |
| Martin Braithwaite | FC Barcelona | 25-Jul-20 |
| Ansu Fati | FC Barcelona | 27-Jul-20 |
| Eden Hazard | Real Madrid | 15-Jul-20 |
| Sergio Ramos | Real Madrid | 16-Jul-20 |
| Karim Benzema | Real Madrid | 18-Jul-20 |
| Gareth Bale | Real Madrid | 20-Jul-20 |
| James Rodriguez | Real Madrid | 24-Jul-20 |
+--------------------+--------------+------------------+
I want to join the tables in a way that answers the following question:
Below is the resulting table after the join:
+--------------------+------------------+--------------+--------------+--------------+
| Player | Player Join Date | Team | Team Ranking | Ranking Date |
+--------------------+------------------+--------------+--------------+--------------+
| Ansu Fati | 27-Jul-20 | FC Barcelona | 5 | 25-Jul-20 |
| Ansu Fati | 27-Jul-20 | FC Barcelona | 4 | 29-Jul-20 |
| Antoine Griezmann | 15-Jul-20 | FC Barcelona | 2 | 15-Jul-20 |
| Antoine Griezmann | 15-Jul-20 | FC Barcelona | 5 | 25-Jul-20 |
| Antoine Griezmann | 15-Jul-20 | FC Barcelona | 4 | 29-Jul-20 |
| Lionel Messi | 15-Jul-20 | FC Barcelona | 2 | 15-Jul-20 |
| Lionel Messi | 15-Jul-20 | FC Barcelona | 5 | 25-Jul-20 |
| Lionel Messi | 15-Jul-20 | FC Barcelona | 4 | 29-Jul-20 |
| Luis Suarez | 15-Jul-20 | FC Barcelona | 2 | 15-Jul-20 |
| Luis Suarez | 15-Jul-20 | FC Barcelona | 5 | 25-Jul-20 |
| Luis Suarez | 15-Jul-20 | FC Barcelona | 4 | 29-Jul-20 |
| Martin Braithwaite | 25-Jul-20 | FC Barcelona | 5 | 25-Jul-20 |
| Martin Braithwaite | 25-Jul-20 | FC Barcelona | 4 | 29-Jul-20 |
| Eden Hazard | 15-Jul-20 | Real Madrid | 1 | 15-Jul-20 |
| Eden Hazard | 15-Jul-20 | Real Madrid | 7 | 20-Jul-20 |
| Eden Hazard | 15-Jul-20 | Real Madrid | 3 | 22-Jul-20 |
| Eden Hazard | 15-Jul-20 | Real Madrid | 1 | 29-Jul-20 |
| Gareth Bale | 20-Jul-20 | Real Madrid | 7 | 20-Jul-20 |
| Gareth Bale | 20-Jul-20 | Real Madrid | 3 | 22-Jul-20 |
| Gareth Bale | 20-Jul-20 | Real Madrid | 1 | 29-Jul-20 |
| James Rodriguez | 24-Jul-20 | Real Madrid | 3 | 22-Jul-20 |
| James Rodriguez | 24-Jul-20 | Real Madrid | 1 | 29-Jul-20 |
| Karim Benzema | 18-Jul-20 | Real Madrid | 1 | 15-Jul-20 |
| Karim Benzema | 18-Jul-20 | Real Madrid | 7 | 20-Jul-20 |
| Karim Benzema | 18-Jul-20 | Real Madrid | 3 | 22-Jul-20 |
| Karim Benzema | 18-Jul-20 | Real Madrid | 1 | 29-Jul-20 |
| Sergio Ramos | 16-Jul-20 | Real Madrid | 1 | 15-Jul-20 |
| Sergio Ramos | 16-Jul-20 | Real Madrid | 7 | 20-Jul-20 |
| Sergio Ramos | 16-Jul-20 | Real Madrid | 3 | 22-Jul-20 |
| Sergio Ramos | 16-Jul-20 | Real Madrid | 1 | 29-Jul-20 |
+--------------------+------------------+--------------+--------------+--------------+
I am having a hard time solving this problem in Oracle SQL 19 as I find the logic to be tricky.
Can someone show me how to do this in Oracle SQL 19?
Any help would be greatly appreciated!
Below is the sql query to generate the tables in Oracle for your convenience:
Ranking Table:
with ranking_tbl as (
select 'FC Barcelona' team, 2 team_ranking, to_date('7/15/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'FC Barcelona' team, 5 team_ranking, to_date('7/25/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'FC Barcelona' team, 4 team_ranking, to_date('7/29/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'Real Madrid' team, 1 team_ranking, to_date('7/15/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'Real Madrid' team, 7 team_ranking, to_date('7/20/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'Real Madrid' team, 3 team_ranking, to_date('7/22/2020', 'MM/DD/YYYY') ranking_date from dual union
select 'Real Madrid' team, 1 team_ranking, to_date('7/29/2020', 'MM/DD/YYYY') ranking_date from dual
)
select *
from ranking_tbl
order by team, ranking_date
Player Table:
with player_tbl as (
select 'FC Barcelona' team, 'Lionel Messi' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'FC Barcelona' team, 'Luis Suarez' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'FC Barcelona' team, 'Antoine Griezmann' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'FC Barcelona' team, 'Martin Braithwaite' player, to_date('7/25/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'FC Barcelona' team, 'Ansu Fati' player, to_date('7/27/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'Real Madrid' team, 'Eden Hazard' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'Real Madrid' team, 'Sergio Ramos' player, to_date('7/16/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'Real Madrid' team, 'Karim Benzema' player, to_date('7/18/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'Real Madrid' team, 'Gareth Bale' player, to_date('7/20/2020', 'MM/DD/YYYY') player_join_date from dual union
select 'Real Madrid' team, 'James Rodriguez' player, to_date('7/24/2020', 'MM/DD/YYYY') player_join_date from dual
)
select *
from player_tbl
order by team, player_join_date
Upvotes: 1
Views: 47
Reputation: 11616
SQL> with ranking_tbl as (
2 select 'FC Barcelona' team, 2 team_ranking, to_date('7/15/2020', 'MM/DD/YYYY') ranking_date from dual union
3 select 'FC Barcelona' team, 5 team_ranking, to_date('7/25/2020', 'MM/DD/YYYY') ranking_date from dual union
4 select 'FC Barcelona' team, 4 team_ranking, to_date('7/29/2020', 'MM/DD/YYYY') ranking_date from dual union
5 select 'Real Madrid' team, 1 team_ranking, to_date('7/15/2020', 'MM/DD/YYYY') ranking_date from dual union
6 select 'Real Madrid' team, 7 team_ranking, to_date('7/20/2020', 'MM/DD/YYYY') ranking_date from dual union
7 select 'Real Madrid' team, 3 team_ranking, to_date('7/22/2020', 'MM/DD/YYYY') ranking_date from dual union
8 select 'Real Madrid' team, 1 team_ranking, to_date('7/29/2020', 'MM/DD/YYYY') ranking_date from dual
9 ),
10 player_tbl as (
11 select 'FC Barcelona' team, 'Lionel Messi' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
12 select 'FC Barcelona' team, 'Luis Suarez' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
13 select 'FC Barcelona' team, 'Antoine Griezmann' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
14 select 'FC Barcelona' team, 'Martin Braithwaite' player, to_date('7/25/2020', 'MM/DD/YYYY') player_join_date from dual union
15 select 'FC Barcelona' team, 'Ansu Fati' player, to_date('7/27/2020', 'MM/DD/YYYY') player_join_date from dual union
16 select 'Real Madrid' team, 'Eden Hazard' player, to_date('7/15/2020', 'MM/DD/YYYY') player_join_date from dual union
17 select 'Real Madrid' team, 'Sergio Ramos' player, to_date('7/16/2020', 'MM/DD/YYYY') player_join_date from dual union
18 select 'Real Madrid' team, 'Karim Benzema' player, to_date('7/18/2020', 'MM/DD/YYYY') player_join_date from dual union
19 select 'Real Madrid' team, 'Gareth Bale' player, to_date('7/20/2020', 'MM/DD/YYYY') player_join_date from dual union
20 select 'Real Madrid' team, 'James Rodriguez' player, to_date('7/24/2020', 'MM/DD/YYYY') player_join_date from dual
21 )
22 select *
23 from (
24 select p.*, r.team_ranking, r.ranking_date,
25 max(case when r.ranking_date < p.player_join_date then r.ranking_date end)
26 over ( partition by player ) max_prev_rank
27 from player_tbl p,
28 ranking_tbl r
29 where p.team = r.team
30 )
31 where ranking_date >= max_prev_rank
32 order by player, ranking_date;
TEAM PLAYER PLAYER_JO TEAM_RANKING RANKING_D MAX_PREV_
------------ ------------------ --------- ------------ --------- ---------
FC Barcelona Ansu Fati 27-JUL-20 5 25-JUL-20 25-JUL-20
FC Barcelona Ansu Fati 27-JUL-20 4 29-JUL-20 25-JUL-20
Real Madrid Gareth Bale 20-JUL-20 1 15-JUL-20 15-JUL-20
Real Madrid Gareth Bale 20-JUL-20 7 20-JUL-20 15-JUL-20
Real Madrid Gareth Bale 20-JUL-20 3 22-JUL-20 15-JUL-20
Real Madrid Gareth Bale 20-JUL-20 1 29-JUL-20 15-JUL-20
Real Madrid James Rodriguez 24-JUL-20 3 22-JUL-20 22-JUL-20
Real Madrid James Rodriguez 24-JUL-20 1 29-JUL-20 22-JUL-20
Real Madrid Karim Benzema 18-JUL-20 1 15-JUL-20 15-JUL-20
Real Madrid Karim Benzema 18-JUL-20 7 20-JUL-20 15-JUL-20
Real Madrid Karim Benzema 18-JUL-20 3 22-JUL-20 15-JUL-20
Real Madrid Karim Benzema 18-JUL-20 1 29-JUL-20 15-JUL-20
FC Barcelona Martin Braithwaite 25-JUL-20 2 15-JUL-20 15-JUL-20
FC Barcelona Martin Braithwaite 25-JUL-20 5 25-JUL-20 15-JUL-20
FC Barcelona Martin Braithwaite 25-JUL-20 4 29-JUL-20 15-JUL-20
Real Madrid Sergio Ramos 16-JUL-20 1 15-JUL-20 15-JUL-20
Real Madrid Sergio Ramos 16-JUL-20 7 20-JUL-20 15-JUL-20
Real Madrid Sergio Ramos 16-JUL-20 3 22-JUL-20 15-JUL-20
Real Madrid Sergio Ramos 16-JUL-20 1 29-JUL-20 15-JUL-20
19 rows selected.
Upvotes: 0