Ihre aktuelle Abfrage liefert nicht das gewünschte Ergebnis, da Sie eine GROUP BY
Klausel in der PERSON_ID
Spalte verwenden, die für beide Einträge einen eindeutigen Wert hat. Als Ergebnis geben Sie beide Zeilen zurück.
Es gibt verschiedene Möglichkeiten, dies zu lösen. Sie können eine Unterabfrage verwenden , um die Aggregatfunktion anzuwenden , um die Rückkehr max(LAST_UPDATE_DATE_TIME)
für jeden SCHOOL_CODE
:
select s1.LAST_UPDATE_DATE_TIME,
s1.SCHOOL_CODE,
s1.PERSON_ID
from SCHOOL_STAFF s1
inner join
(
select max(LAST_UPDATE_DATE_TIME) LAST_UPDATE_DATE_TIME,
SCHOOL_CODE
from SCHOOL_STAFF
group by SCHOOL_CODE
) s2
on s1.SCHOOL_CODE = s2.SCHOOL_CODE
and s1.LAST_UPDATE_DATE_TIME = s2.LAST_UPDATE_DATE_TIME;
Siehe SQL Fiddle with Demo
Oder Sie können eine Fensterfunktion verwenden , um die Datenzeilen für jede Schule mit den neuesten Daten zurückzugeben LAST_UPDATE_DATE_TIME
:
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
row_number() over(partition by SCHOOL_CODE
order by LAST_UPDATE_DATE_TIME desc) seq
from SCHOOL_STAFF
where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;
Siehe SQL Fiddle with Demo
Diese Abfrage wird implementiert row_number()
die Zuordnung einer eindeutigen Nummer zu jeder Zeile in der Partition von SCHOOL_CODE
und platziert in absteigender Reihenfolge basierend auf der LAST_UPDATE_DATE_TIME
.
Als Randnotiz ist die JOIN mit Aggregat-Funktion nicht genau die gleiche wie die row_number()
Version. Wenn Sie zwei Zeilen mit derselben Ereigniszeit haben, gibt JOIN beide Zeilen zurück, während JOIN row_number()
nur eine zurückgibt. Wenn Sie beide mit einer Fensterfunktion zurückgeben möchten, sollten Sie die verwendenrank()
stattdessen Fensterfunktion verwenden, da sie Bindungen zurückgibt:
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME
from
(
select SCHOOL_CODE, PERSON_ID, LAST_UPDATE_DATE_TIME,
rank() over(partition by SCHOOL_CODE
order by LAST_UPDATE_DATE_TIME desc) seq
from SCHOOL_STAFF
where STAFF_TYPE_NAME='Principal'
) d
where seq = 1;
Siehe Demo