Gegeben die SQL-Tabelle
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
Ist es möglich, nach IDs zu suchen, die eine Zeile mit employee_type "intern" haben und die darüberliegende Zeile in der Tabelle (gleiche ID mit späterem Datum) mit employee_type "full-time"
In diesem Fall erfüllt id 1 meine Anforderung.
Danke vielmals!
Antworten:
2 für die Antwort № 1Angenommen, Sie meinen dieselbe ID mit dem vorherigen Datum, dann können Sie verwenden lag()
, eine ANSI-Standardfunktion, die von den meisten Datenbanken unterstützt wird:
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"
);
Wenn Ihre Datenbank nicht unterstützt wird lag()
, Sie können mit korrelierten Unterabfragen etwas Ähnliches machen.
1 für die Antwort № 2
Ich glaube, die Anfrage ist nicht wie in der Frage beschrieben; stattdessen scheinen Sie alle Zeilen für Praktikanten aufzulisten.
SELECT
t1.*
FROM yourtable AS t1
INNER JOIN (
SELECT DISTINCT
id
FROM yourtable
WHERE employee_type = "intern"
) AS t2 ON t1.id = t2.id
;
Alternativ möchten Sie möglicherweise nur diejenigen Personen wünschen, die sowohl "intern" als auch "full time" waren. In diesem Fall könnten Sie die folgende Abfrage verwenden, die eine HAVING-Klausel verwendet:
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
;