2015-11-21 12 views
5

Sto tentando di visualizzare un elenco di tutti gli amministratori che hanno diretto 2 anni consecutivi.Visualizzazione dei valori che si verificano in sequenza

Dati i seguenti dati:

Pantomime table: 
Year titleID DirectorID 
2000 1   1 
2001 2   7 
2002 3   7 
2003 4   8 
2004 5   9 
2005 6   9 

Questo è il risultato desiderato:

DirectorID 
    7 
    9 

Questa è la query ho provato finora, ma è stato in grado di ottenere i risultati desiderati.

SELECT directorID 
FROM pantomime 
where directorID = directorID+1 
GROUP BY directorID 
+0

Due anni o titoli consecutivi? – mezmi

+0

anni consecutivi. Quindi, in sostanza, anno 2001 directorID 7, anno 2002 directorID 7, anno 2004 directorID 9, anno 2005 directorID 9 – ShyDonkey

+1

È solo un semplice join – Strawberry

risposta

3

è possibile utilizzare iscriverti per vedere quali voci ha valore il prossimo anno, e poi con distinte ottenere le pertinenti id:

select distinct a.directorID 
from Pantomime as a 
inner join Pantomime as b on a.year = b.year-1 
         and a.directorID = b.directorID; 

dal momento che sto usando interno join, faremo ottenere i record da un solo se esistono in senso b- se year-1 appare nella tabella per questo metodo directorId

+0

Questa sembra la soluzione più elegante per me. – Strawberry

5

One utilizza exists:

select distinct p.directorId 
from pantomine p 
where exists (select 1 
       from pantomine p2 
       where p2.directorId = p.directorId and p2.year = p.year + 1 
      ); 

Ci sono altre varianti di divertimento su questa idea, come l'utilizzo in:

select distinct p.directorId 
from pantomine p 
where p.year in (select p2.year + 1 
       from pantomine p2 
       where p2.directorId = p.directorId 
       ); 

E qui è un metodo del tutto arcana che non utilizza join-come meccanismi a tutti (solo aggregazione):

select distinct directorId 
from ((select directorId, year from pantomine) 
     union all 
     (select directorId, year + 1 from pantomine) 
    ) p 
group by directorId, year 
having count(*) = 2; 

Questo è anche uno di quei casi davvero rari di utilizzo di select distinct con group by.

0

Prova questa, senza fughe o sub-query, solo un semplice raggruppamento:

SELECT directorID 
FROM pantomime 
GROUP BY directorID 
HAVING COUNT(*) = 2 
AND MAX(Year) = MIN(Year) + 1 

Ecco un fiddle.

Problemi correlati