2015-11-21 6 views
5

Ich versuche eine Liste aller Direktoren anzuzeigen, die 2 Jahre nacheinander geleitet haben.Anzeige der Werte, die nacheinander auftreten

folgende Daten Gegeben:

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

Dies ist das gewünschte Ergebnis:

DirectorID 
    7 
    9 

Dies ist die Abfrage, die ich bisher versucht haben, konnte aber nicht die gewünschten Ergebnisse zu erzielen.

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

Zwei aufeinander folgende Jahre oder Titel? – mezmi

+0

In aufeinanderfolgenden Jahren. Also im Wesentlichen, Jahr 2001 DirectorID 7, Jahr 2002 DirectorID 7, Jahr 2004 DirectorID 9, Jahr 2005 DirectorID 9 – ShyDonkey

+1

Es ist nur ein einfacher Beitritt – Strawberry

Antwort

3

Sie verwenden können, kommen, um zu sehen, welche Einträge des nächsten Jahres Wert hat, und dann mit ausgeprägtem den entsprechenden IDs erhalten:

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

da ich verwende inneren beitreten, werden wir erhalten Datensätze aus einem nur, wenn sie in b- Bedeutung existieren, wenn year-1 für diese directorId

+0

Dies scheint die eleganteste Lösung für mich. – Strawberry

5

eine Methode in der Tabelle erscheint verwendet 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 
      ); 

Es gibt auch andere Varianten Spaß auf dieser Idee, wie die Verwendung von in:

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

Und hier ist eine völlig obskure Methode, die nicht beitreten artige nicht verwendet Mechanismen auf alle (nur Aggregation):

Dies ist auch einer dieser wirklich, wirklich seltenen Fälle der Verwendung select distinct mit group by.

0

das Versuchen, tritt keine oder Unterabfragen, nur eine einfache Gruppierung:

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

Hier ist ein fiddle.

Verwandte Themen