/ / Wie kann ich in SQL durch zwei durchgehende Zeilen suchen? - SQL, Datenbank, Peoplesoft

Wie kann ich nach zwei fortlaufenden Zeilen in SQL suchen? - SQL, Datenbank, Peoplesoft

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 № 1

Angenommen, 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
;