職歴が重複する可能性があるため、この問題は思ったより難しいです。実際、ある雇用期間を別の雇用期間の「中に」入れることも、両端で重複させることもできます。
探しているのは、開始日までのギャップがあり、別の雇用期間にない EndDateです。そこで、次のように、相関サブクエリを使用して、終了日の後の次の開始日を取得しましょう。
select t.*,
(select StartDate
from t t2
where t2.user_id = t.user_id and
t2.StartDate > t.EndDate
order by StartDate desc
limit 1
) nextStartDate
from t
さて、問題は次のとおりです。期間は別の期間に含まれています。このために、複雑なwhere
句を使用します。
select t.*
from (select t.*,
(select StartDate
from t t2
where t2.user_id = t.user_id and
t2.StartDate > t.EndDate
order by StartDate desc
limit 1
) nextStartDate
from t
) t
where not exists (select 1
from t t2
where t2.StartDate <= t.EndDate and
t2.EndDate >= t.nextStartDate
) and
(t.EndDate is null or t.EndDate > now())
オーバーラップをどのように処理しているかによっては、日付の間に数日のラグを許容したい場合があります。
これにより、ギャップがあるテーブル内のすべてのレコードが返されます。サンプル データでは、今日 (2013-05-19) のレコードが返されます。「販売」の記録は、その後「マーケティング」の位置までギャップがあります。「マーケティング」は、過去に終了しているため、将来返されます。
実際には、1 つのギャップによって複数のレコードが返される可能性があります。これは、オーバーラップがある場合に発生する可能性があります。これについては、(0, 10)、(5, 12)、(15, 20) の数字だけで説明します。12/13 から始まるギャップは両方の記録に影響します。これが問題であれば、クエリを修正することができますが、それを修正する方法について最初に考えた場合、クエリはさらに複雑になります。
where
おそらく、最も外側の句に入れることができるユーザーIDでもフィルタリングします。