Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
PERCENTILE_ CONT Fenster-Funktion
PERCENTILE_ CONT ist eine umgekehrte Verteilungsfunktion, die von einem kontinuierlichen Verteilungsmodell ausgeht. Sie empfängt einen Perzentilwert und eine Sortierspezifikation und gibt einen interpolierten Wert zurück, der in Bezug auf die Sortierspezifikation in den angegebenen Perzentilwert fällt.
PERCENTILE_ CONT berechnet eine lineare Interpolation zwischen Werten, nachdem sie geordnet wurden. Mithilfe des Perzentilwerts (P)
und der Anzahl der Nicht-Null-Zeilen (N)
in der Aggregationsgruppe berechnet die Funktion die Anzahl der Zeilen, nachdem die Zeilen entsprechend der Sortierspezifikation angeordnet wurden. Die Anzahl von Zeilen (RN)
wird mit der Formel RN = (1+ (P*(N-1))
berechnet. Das Endergebnis der Aggregationsfunktion wird durch lineare Interpolierung zwischen den Werten aus Zeilen zwischen CRN = CEILING(RN)
und FRN = FLOOR(RN)
berechnet.
Das Ergebnis wird wie folgt aussehen.
Wenn (CRN = FRN = RN)
, ist das Ergebnis (value of expression from
row at RN)
Andernfalls sieht das Ergebnis wie folgt aus:
(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of
expression for row at CRN)
.
Sie können nur die PARTITION Klausel in der Klausel angeben. OVER Falls PARTITION angegeben, CONT gibt PERCENTILE _ für jede Zeile den Wert zurück, der in das angegebene Perzentil innerhalb einer Gruppe von Werten innerhalb einer bestimmten Partition fallen würde.
Syntax
PERCENTILE_CONT ( percentile ) WITHIN GROUP (ORDER BY expr) OVER ( [ PARTITION BY expr_list ] )
Argumente
- percentile
-
Numerische Konstante zwischen 0 und 1. Null-Werte werden bei der Berechnung ignoriert.
- WITHINGROUP(VON expr) ORDER
-
Gibt numerische oder Datum-/Zeitwerte an, nach denen das Perzentil sortiert und berechnet werden soll.
- OVER
-
Gibt die Fensterpartitionierung an. Die OVER Klausel darf keine Fensterreihenfolge oder Fensterrahmenspezifikation enthalten.
- PARTITIONVON expr
-
Optionales Argument, das den Datensatzbereich für jede Gruppe in der OVER Klausel festlegt.
Rückgabewert
Der Rückgabetyp wird durch den Datentyp des ORDER BY-Ausdrucks in der WITHIN GROUP Klausel bestimmt. Die folgende Tabelle zeigt den Rückgabetyp für jeden ORDER BY-Ausdrucks-Datentyp.
Typ der Eingabe | Typ der Rückgabe |
---|---|
INT2, INT4, INT8, NUMERIC, DECIMAL | DECIMAL |
FLOAT, DOUBLE | DOUBLE |
DATE | DATE |
TIMESTAMP | TIMESTAMP |
Nutzungshinweise
Wenn der ORDER BY-Ausdruck ein DECIMAL Datentyp ist, der mit der maximalen Genauigkeit von 38 Ziffern definiert wurde, ist es möglich, CONT dass PERCENTILE _ entweder ein ungenaues Ergebnis oder einen Fehler zurückgibt. Wenn der Rückgabewert der CONT Funktion PERCENTILE _ 38 Ziffern überschreitet, wird das Ergebnis gekürzt, bis es passt, was zu einem Genauigkeitsverlust führt. Wenn während der Interpolierung ein Zwischenergebnis die maximal zulässige Genauigkeit überschreitet, erfolgt ein numerischer Überlauf und die Funktion gibt einen Fehler zurück. Um diese Bedingungen zu vermeiden, empfehlen wir, entweder einen Datentyp mit niedrigerer Genauigkeit zu verwenden oder den ORDER BY-Ausdruck auf eine niedrigere Genauigkeit umzuwandeln.
Beispielsweise gibt eine SUM Funktion mit einem DECIMAL Argument eine Standardgenauigkeit von 38 Ziffern zurück. Die Ergebnisskala ist die gleiche wie die Skala des Arguments. So gibt beispielsweise die Angabe SUM einer Spalte DECIMAL (5,2) den Datentyp DECIMAL (38,2) zurück.
Im folgenden Beispiel wird eine SUM Funktion in der ORDER BY-Klausel einer PERCENTILE CONT _-Funktion verwendet. Der Datentyp der PRICEPAID Spalte ist DECIMAL (8,2), daher gibt die SUM Funktion DECIMAL (38,2) zurück.
select salesid, sum(pricepaid), percentile_cont(0.6)
within group (order by sum(pricepaid) desc) over()
from sales where salesid < 10 group by salesid;
Um einen möglichen Genauigkeitsverlust oder einen Überlauffehler zu vermeiden, wandeln Sie das Ergebnis in einen DECIMAL Datentyp mit niedrigerer Genauigkeit um, wie das folgende Beispiel zeigt.
select salesid, sum(pricepaid), percentile_cont(0.6)
within group (order by sum(pricepaid)::decimal(30,2) desc) over()
from sales where salesid < 10 group by salesid;
Beispiele
In den folgenden Beispielen wird die WINSALES Tabelle verwendet. Eine Beschreibung der WINSALES Tabelle finden Sie unterBeispieltabelle mit Beispielen von Fensterfunktionen.
select sellerid, qty, percentile_cont(0.5)
within group (order by qty)
over() as median from winsales;
sellerid | qty | median
----------+-----+--------
1 | 10 | 20.0
1 | 10 | 20.0
3 | 10 | 20.0
4 | 10 | 20.0
3 | 15 | 20.0
2 | 20 | 20.0
3 | 20 | 20.0
2 | 20 | 20.0
3 | 30 | 20.0
1 | 30 | 20.0
4 | 40 | 20.0
(11 rows)
select sellerid, qty, percentile_cont(0.5)
within group (order by qty)
over(partition by sellerid) as median from winsales;
sellerid | qty | median
----------+-----+--------
2 | 20 | 20.0
2 | 20 | 20.0
4 | 10 | 25.0
4 | 40 | 25.0
1 | 10 | 10.0
1 | 10 | 10.0
1 | 30 | 10.0
3 | 10 | 17.5
3 | 15 | 17.5
3 | 20 | 17.5
3 | 30 | 17.5
(11 rows)
Im folgenden Beispiel werden PERCENTILE _ CONT und PERCENTILE _ DISC der Ticketverkäufe für Verkäufer im Bundesstaat Washington berechnet.
SELECT sellerid, state, sum(qtysold*pricepaid) sales,
percentile_cont(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over(),
percentile_disc(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over()
from sales s, users u
where s.sellerid = u.userid and state = 'WA' and sellerid < 1000
group by sellerid, state;
sellerid | state | sales | percentile_cont | percentile_disc
----------+-------+---------+-----------------+-----------------
127 | WA | 6076.00 | 2044.20 | 1531.00
787 | WA | 6035.00 | 2044.20 | 1531.00
381 | WA | 5881.00 | 2044.20 | 1531.00
777 | WA | 2814.00 | 2044.20 | 1531.00
33 | WA | 1531.00 | 2044.20 | 1531.00
800 | WA | 1476.00 | 2044.20 | 1531.00
1 | WA | 1177.00 | 2044.20 | 1531.00
(7 rows)