postgresql
Funciones agregadas
Buscar..
Estadísticas simples: min (), max (), avg ()
Para determinar algunas estadísticas simples de un valor en una columna de una tabla, puede usar una función agregada.
Si su tabla de individuals
es:
Nombre | Años |
---|---|
Allie | 17 |
Amanda | 14 |
Alana | 20 |
Podría escribir esta declaración para obtener el valor mínimo, máximo y promedio:
SELECT min(age), max(age), avg(age)
FROM individuals;
Resultado:
min | max | avg |
---|---|---|
14 | 20 | 17 |
string_agg (expresión, delimitador)
Puede concatenar cadenas separadas por delimitador utilizando la función string_agg()
.
Si su tabla de individuals
es:
Nombre | Años | País |
---|---|---|
Allie | 15 | Estados Unidos |
Amanda | 14 | Estados Unidos |
Alana | 20 | Rusia |
Puede escribir la SELECT ... GROUP BY
para obtener nombres de cada país:
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Tenga en cuenta que necesita usar una cláusula GROUP BY
porque string_agg()
es una función agregada.
Resultado:
nombres | país |
---|---|
Allie amanda | Estados Unidos |
Alana | Rusia |
Más función agregada de PostgreSQL descrita aquí
regr_slope (Y, X): pendiente de la ecuación lineal de ajuste por mínimos cuadrados determinada por los pares (X, Y)
Para ilustrar cómo usar regr_slope (Y, X), lo apliqué a un problema del mundo real. En Java, si no limpia la memoria correctamente, la basura se puede atascar y llenar la memoria. Vuelca estadísticas cada hora sobre la utilización de la memoria de diferentes clases y la carga en una base de datos de Postgres para su análisis.
Todos los candidatos a pérdida de memoria tendrán una tendencia a consumir más memoria a medida que pase más tiempo. Si trazas esta tendencia, te imaginas una línea que va hacia arriba y hacia la izquierda:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Supongamos que tiene una tabla que contiene datos de histograma de volcado de pila (una asignación de clases a la cantidad de memoria que consumen):
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
);
Para calcular la pendiente de cada clase, agrupamos por sobre la clase. La cláusula HAVING> 0 garantiza que solo obtengamos candidatos con una pendiente positiva (una línea que va hacia arriba y hacia la izquierda). Clasificamos por la pendiente descendente para obtener las clases con la mayor tasa de aumento de memoria en la parte superior.
-- 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 ;
Salida:
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
Desde la salida, vemos que el consumo de memoria de java.util.ArrayList está aumentando más rápidamente a 71.799 bytes por segundo y es potencialmente parte de la pérdida de memoria.