2015-11-21 21 views
5

Próbuję wyświetlić listę wszystkich dyrektorów, którzy wyreżyserowali 2 lata z rzędu.Wyświetlanie wartości następujących po sobie

Biorąc pod uwagę następujące dane:

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

Jest to pożądany efekt:

DirectorID 
    7 
    9 

To zapytanie Próbowałem tak daleko, ale nie był w stanie uzyskać pożądane rezultaty.

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

Dwa kolejne lata lub tytuły? – mezmi

+0

Kolejne lata. Zasadniczo, rok 2001 directorID 7, rok 2002 directorID 7, rok 2004 directorID 9, rok 2005 directorID 9 – ShyDonkey

+1

To po prostu proste dołączenie – Strawberry

Odpowiedz

3

można użyć zalogowany, aby zobaczyć, które wpisy ma przyszłoroczny wartość, a następnie z odrębnych uzyskać odpowiednich identyfikatorów:

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

ponieważ używam wewnętrzna dołączyć, będziemy uzyskać rekordy z tylko wtedy, gdy występują one w b- rozumieniu jeśli year-1 pojawia się w tabeli na tej directorId

+0

To wydaje się być najbardziej eleganckim rozwiązaniem dla mnie. – Strawberry

5

Jedna metoda wykorzystuje 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 
      ); 

Istnieją inne warianty zabawy na ten pomysł, takie jak korzystanie in:

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

i tutaj jest zupełnie tajemna metoda, która nie korzysta z takich mechanizmów join-w ogóle (tylko agregacji):

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; 

Jest to również jeden z tych naprawdę, bardzo rzadkich przypadków używania select distinct z group by.

0

Spróbuj tego, nie łączy się ani pod-zapytań, tylko proste grupowanie:

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

Oto fiddle.

Powiązane problemy