2012-12-12 2 views
0

Oracle 11g Comment puis-je écrire une requête pour obtenir les résultats souhaités? Plus précisément, comment joindre les enregistrements les plus récents dans la table EXIGENCES?Comment utiliser multiple rank() dans une seule requête?

Critères de sélection: Les plus récents détails et les plus récentes exigences

with 
detail as (
select 'TAXI' code, '4920' numb, 1990 dstart, 'BLUE' taxi_name from dual union all 
select 'TAXI' code, '4920' numb, 2000 dstart, 'PINK' taxi_name from dual union all 
select 'TAXI' code, '4920' numb, 2008 dstart, 'CYAN' taxi_name from dual), 

requirement as (
select 'TAXI' code, '4920' numb, 2 seqno, 2000 rstart, 25,min_age,'CDL',permit from dual union all 
select 'TAXI' code, '4920' numb, 4 seqno, 2000 rstart, 27 min_age, 'CAR' permit from dual union all 
select 'TAXI' code, '4920' numb, 6 seqno, 2000 rstart, 29 min_age, 'HAZ' permit from dual union all 
select 'TAXI' code, '4920' numb, 2 seqno, 2007 rstart, 24 min_age, 'CDL' permit from dual union all 
select 'TAXI' code, '4920' numb, 4 seqno, 2007 rstart, 26 min_age, 'VAN' permit from dual union all 
select 'TAXI' code, '4920' numb, 6 seqno, 2007 rstart, 28 min_age, 'HAZ' permit from dual 

)

select code,numb,taxi_name, dstart, ranking from (
select code, numb, taxi_name,dstart, rank() over (partition by code, numb 
              order by dstart desc) ranking 
from detail) 
where ranking =1 

rendements

CODE NUMB NAME YEAR  
---- ---- ----- ------- 
TAXI 4920 CYAN 2008 


DESIRED OUTPUT 
-------------------------- 
code numb name  dstart  sqno rstart min_age permit 
TAXI 4920 CYAN  2008  2   2007 24  CDL 
TAXI 4920 CYAN  2008  4   2007 26  VAN 
TAXI 4920 CYAN  2008  6   2007 28  HAZ 

Répondre

1

Eh bien, vous avez essentiellement l'idée. Il vous suffit de l'appliquer à deux tables:

select code,numb,taxi_name, dstart, ranking 
from (select code, numb, taxi_name,dstart, 
      rank() over (partition by code, numb order by dstart desc) as ranking 
     from detail 
    ) d join 
    (select r.*, 
      rank() over (partition by code, numb order by rstart desc) as ranking 
     from requirement 
    ) r 
    on d.code = r.code and 
     d.ranking = 1 and 
     r.ranking = 1 
1

Votre requête complète peut être quelque chose comme ceci:

with detail as 
(
    select 'TAXI' code, '4920' numb, 1990 dstart, 'BLUE' taxi_name from dual union all 
    select 'TAXI' code, '4920' numb, 2000 dstart, 'PINK' taxi_name from dual union all 
    select 'TAXI' code, '4920' numb, 2008 dstart, 'CYAN' taxi_name from dual 
), 
requirement as 
(
    select 'TAXI' code, '4920' numb, 2 seqno, 2000 rstart, 25 min_age,'CDL' permit from dual union all 
    select 'TAXI' code, '4920' numb, 4 seqno, 2000 rstart, 27 min_age, 'CAR' permit from dual union all 
    select 'TAXI' code, '4920' numb, 6 seqno, 2000 rstart, 29 min_age, 'HAZ' permit from dual union all 
    select 'TAXI' code, '4920' numb, 2 seqno, 2007 rstart, 24 min_age, 'CDL' permit from dual union all 
    select 'TAXI' code, '4920' numb, 4 seqno, 2007 rstart, 26 min_age, 'VAN' permit from dual union all 
    select 'TAXI' code, '4920' numb, 6 seqno, 2007 rstart, 28 min_age, 'HAZ' permit from dual 
) 
select code,numb,taxi_name, dstart, seqno, rstart, min_age, permit 
from 
(
    select d.code, d.numb, d.taxi_name, d.dstart, rank() over (partition by d.code, d.numb order by d.dstart desc) ranking, 
     seqno, rstart, min_age, permit 
    from detail d 
    inner join 
    (
     select code, numb, seqno, rstart, min_age, permit, 
      rank() over (partition by code, numb order by rstart desc) ranking 
     from requirement 
    ) r 
     on d.code = r.code 
     and d.numb = r.numb 
     and r.ranking = 1 
) 
where ranking =1 

Voir SQL Fiddle with Demo

Le résultat est:

| CODE | NUMB | TAXI_NAME | DSTART | SEQNO | RSTART | MIN_AGE | PERMIT | 
------------------------------------------------------------------------ 
| TAXI | 4920 |  CYAN | 2008 |  2 | 2007 |  24 | CDL | 
| TAXI | 4920 |  CYAN | 2008 |  4 | 2007 |  26 | VAN | 
| TAXI | 4920 |  CYAN | 2008 |  6 | 2007 |  28 | HAZ | 
Questions connexes