Отображение значений, которые происходят последовательно

Я пытаюсь отобразить список всех директоров, которые направили 2 года подряд.

Учитывая следующие данные:

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

Это желаемый результат:

DirectorID
 7
 9

Это запрос, который я пробовал до сих пор, но не смог получить желаемые результаты.

SELECT directorID
FROM pantomime
where directorID = directorID+1
GROUP BY directorID
3 ответа

В одном методе используется 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
 );

В этой идее есть другие интересные варианты, такие как использование in:

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

И вот совершенно тайный метод, который вообще не использует механизмы объединения (просто агрегация):

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;

Это также один из тех, действительно, очень редких случаев использования select distinct с group by.


вы можете использовать join, чтобы узнать, какие записи имеют значение следующего года, а затем с разным получить соответствующие идентификаторы:

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

так как я использую внутреннее соединение, мы получим записи только из них, если они существуют в b-значении, если year-1 появляется в вашей таблице для этого DirectorId


Попробуйте это, нет объединений или подзапросов, просто простая группировка:

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

Вот скрипка.

licensed under cc by-sa 3.0 with attribution.