SQLテーブルが与えられた場合
id date employee_type employee_level
1 10/01/2015 other 2
1 09/13/2011 full-time 1
1 09/25/2010 intern 1
2 09/25/2013 full-time 3
2 09/25/2011 full-time 2
2 09/25/2008 full-time 1
3 09/23/2015 full-time 5
3 09/23/2013 full-time 4
employee_typeが「intern」の行と、employee_typeが「full-time」の表の上の行(後の日付の同じID)を持つIDを検索することは可能ですか?
この場合、ID 1は私の要件を満たしています。
どうもありがとう!
回答:
回答№1は2前の日付と同じIDを意味すると仮定すると、使用できます lag()
、ほとんどのデータベースでサポートされているANSI標準機能:
select t.*
from table t
where t.id in (select id
from (select t.*,
lag(employee_type) over (partition by id order by date) as prev_et
from table t
) tt
where tt.employee_type = "intern" and tt.prev_et = "full-time"
);
データベースがサポートしていない場合 lag()
、相関サブクエリでも同様のことができます。
回答№2の場合は1
この質問は質問に記載されているとおりではありません。代わりに、あなたが望んでいると思われるのは、インターンだった人のすべての行をリストすることです。
SELECT
t1.*
FROM yourtable AS t1
INNER JOIN (
SELECT DISTINCT
id
FROM yourtable
WHERE employee_type = "intern"
) AS t2 ON t1.id = t2.id
;
あるいは、「インターン」と「フルタイム」の両方である人々のみが必要な場合があります。その場合、HAVING句を使用する以下のクエリを使用できます。
SELECT
t1.*
FROM yourtable AS t1
INNER JOIN (
SELECT id
FROM yourtable
WHERE employee_type = "intern"
OR employee_type = "full-time"
GROUP BY id
HAVING COUNT(DISTINCT employee_type) > 1
) AS t2 ON t1.id = t2.id
;