Verwendung der SCOTT Schema. Ich versuche, die Person, die ein Gehalt hat, am nächsten zum Durchschnitt zu bekommen.Abfrage des Oracle SCOTT-Schemas - Welches Gehalt kommt dem Durchschnitt am nächsten?
Kann die obige Lösung verbessert werden?
Verwendung der SCOTT Schema. Ich versuche, die Person, die ein Gehalt hat, am nächsten zum Durchschnitt zu bekommen.Abfrage des Oracle SCOTT-Schemas - Welches Gehalt kommt dem Durchschnitt am nächsten?
Kann die obige Lösung verbessert werden?
Sie verwenden eine Nicht-Standard-Oracle-Funktion. Daten in Unterabfragen haben ursprünglich keine Reihenfolge, aber in Oracle können Sie sie bestellen, um später die ROWNUM-Kriterien anwenden zu können. ROWNUM ist auch Oracle-spezifisch.
Darüber hinaus kann es mehrere Mitarbeiter mit dem gleichen Gehalt geben, wo Sie eine von ihnen willkürlich auswählen, anstatt sie alle zu zeigen.
Hier ist, wie die Mitarbeiter auszuwählen (n) mit dem Gehalt der Nähe des avarage in Standard-SQL:
select *
from emp
order by abs(sal - avg(sal) over())
fetch first row with ties;
Diese letzte Zeile nur von Oracle 12c zur Verfügung steht.
Bei älteren Versionen (dh Oracle 9i, 10i oder 11g) Sie Ihre Zeilen stattdessen Rang würden:
select empno, ename, sal
from
(
select empno, ename, sal, rank() over (order by diff) as rnk
from
(
select emp.*, abs(sal - avg(sal) over()) as diff
from emp
) evaluated
) ranked
where rnk = 1;
with av as (select avg(sal) avgsal from scott.emp)
select emp.*, abs(emp.sal-av.avgsal) dist
from scott.emp, av
order by dist;
Oben sieht besser für mich aus, aber wahrscheinlich können Sie es am besten mit analytischen Funktion erhalten. Etwas wie:
select * from (
select emp.*, abs(avg(emp.sal) over() - sal) diff
from scott.emp order by diff)
where rownum = 1;
Mitarbeiter Pulling Daten wieder mit der Unterabfrage:
select empno, sal, SalDif
from
(
select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif
from emp
order by SalDif
)
where rownum = 1;
oder als CTE:
with CTE as
(
select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif
from emp
order by SalDif
)
select empno, sal, SalDif
from CTE
where rownum = 1;
Hallo, mit meiner 12c Datenbank, Ihre Reihe Klausel Begrenzung einen Fehler wirft. Wenn ich die Klausel in "FIRST REIW ROW WITH TIES" ändere, funktioniert es. –
@ Patrick Bacon: Danke. Du hast natürlich Recht. –