postgresql
Aggregatfunktionen
Suche…
Einfache Statistik: min (), max (), avg ()
Um einige einfache Statistiken eines Werts in einer Tabellenspalte zu ermitteln, können Sie eine Aggregatfunktion verwenden.
Wenn Ihre individuals
ist:
Name | Alter |
---|---|
Allie | 17 |
Amanda | 14 |
Alana | 20 |
Sie können diese Anweisung schreiben, um den Minimal-, Maximal- und Durchschnittswert zu erhalten:
SELECT min(age), max(age), avg(age)
FROM individuals;
Ergebnis:
Mindest | max | Durchschn |
---|---|---|
14 | 20 | 17 |
string_agg (Ausdruck, Trennzeichen)
Sie können Zeichenfolgen, die durch Trennzeichen getrennt sind, mithilfe der Funktion string_agg()
verketten.
Wenn Ihre individuals
ist:
Name | Alter | Land |
---|---|---|
Allie | fünfzehn | Vereinigte Staaten von Amerika |
Amanda | 14 | Vereinigte Staaten von Amerika |
Alana | 20 | Russland |
Sie könnten eine SELECT ... GROUP BY
Anweisung schreiben, um Namen aus jedem Land zu erhalten:
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Beachten Sie, dass Sie eine GROUP BY
Klausel verwenden müssen, da string_agg()
eine Aggregatfunktion ist.
Ergebnis:
Namen | Land |
---|---|
Allie, Amanda | Vereinigte Staaten von Amerika |
Alana | Russland |
Weitere hier beschriebene PostgreSQL-Aggregatfunktion
regr_slope (Y, X): Steigung der linearen Gleichung für die Anpassung der kleinsten Quadrate, bestimmt durch die (X, Y) -Paare
Um die Verwendung von regr_slope (Y, X) zu veranschaulichen, habe ich es auf ein Problem der realen Welt angewendet. Wenn Sie in Java den Speicher nicht ordnungsgemäß bereinigen, kann der Müll hängen bleiben und den Speicher füllen. Sie legen jede Stunde Statistiken über die Speicherauslastung verschiedener Klassen ab und laden sie zur Analyse in eine Postgres-Datenbank.
Alle Speicherverlustkandidaten tendieren dazu, mehr Speicher zu verbrauchen, wenn mehr Zeit vergeht. Wenn Sie diesen Trend darstellen, können Sie sich eine Linie nach links und links vorstellen:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Angenommen, Sie haben eine Tabelle mit Heap-Dump-Histogrammdaten (eine Zuordnung von Klassen zu ihrem Speicherbedarf):
CREATE TABLE heap_histogram (
-- when the heap histogram was taken
histwhen timestamp without time zone NOT NULL,
-- the object type bytes are referring to
-- ex: java.util.String
class character varying NOT NULL,
-- the size in bytes used by the above class
bytes integer NOT NULL
);
Um die Steigung für jede Klasse zu berechnen, gruppieren wir die Klasse über. Die HAVING-Klausel> 0 stellt sicher, dass nur Kandidaten mit einem positiven Slop (eine Linie nach oben und nach links) angezeigt werden. Wir sortieren nach der Steigung absteigend, sodass die Klassen mit der höchsten Speicherzuwachsrate an der Spitze angezeigt werden.
-- epoch returns seconds
SELECT class, REGR_SLOPE(bytes,extract(epoch from histwhen)) as slope
FROM public.heap_histogram
GROUP BY class
HAVING REGR_SLOPE(bytes,extract(epoch from histwhen)) > 0
ORDER BY slope DESC ;
Ausgabe:
class | slope
---------------------------+----------------------
java.util.ArrayList | 71.7993806279174
java.util.HashMap | 49.0324576155785
java.lang.String | 31.7770770326123
joe.schmoe.BusinessObject | 23.2036817108056
java.lang.ThreadLocal | 20.9013528767851
Die Ausgabe zeigt, dass der Speicherverbrauch von java.util.ArrayList mit 71.799 Bytes pro Sekunde am schnellsten ansteigt und möglicherweise Teil des Speicherverlusts ist.