postgresql
Совокупные функции
Поиск…
Простая статистика: min (), max (), avg ()
Чтобы определить некоторую простую статистику значения в столбце таблицы, вы можете использовать агрегатную функцию.
Если ваш individuals
стол:
название | Возраст |
---|---|
Алли | 17 |
Аманда | 14 |
Alana | 20 |
Вы можете написать этот оператор, чтобы получить минимальное, максимальное и среднее значение:
SELECT min(age), max(age), avg(age)
FROM individuals;
Результат:
мин | Максимум | средний |
---|---|---|
14 | 20 | 17 |
string_agg (выражение, разделитель)
Вы можете конкатенировать строки, разделенные разделителем, с помощью функции string_agg()
.
Если ваш individuals
стол:
название | Возраст | Страна |
---|---|---|
Алли | 15 | Соединенные Штаты Америки |
Аманда | 14 | Соединенные Штаты Америки |
Alana | 20 | Россия |
Вы можете написать SELECT ... GROUP BY
для получения имен из каждой страны:
SELECT string_agg(name, ', ') AS names, country
FROM individuals
GROUP BY country;
Обратите внимание, что вам нужно использовать предложение GROUP BY
, потому что string_agg()
является агрегированной функцией.
Результат:
имена | страна |
---|---|
Элли, Аманда | Соединенные Штаты Америки |
Alana | Россия |
Подробнее описанная здесь функция агрегации PostgreSQL
regr_slope (Y, X): наклон линейного уравнения с наименьшим квадратом, определяемого парами (X, Y)
Чтобы проиллюстрировать, как использовать regr_slope (Y, X), я применил его к реальной проблеме. В Java, если вы не правильно очищаете память, мусор может застрять и заполнить память. Каждый час вы отправляете статистику о загрузке памяти различными классами и загружаете ее в базу данных postgres для анализа.
Все кандидаты на утечку памяти будут иметь тенденцию потреблять больше памяти с большим количеством времени. Если вы планируете эту тенденцию, вы можете представить линию, идущую вверх и влево:
^
|
s | Legend:
i | * - data point
z | -- - trend
e |
( |
b | *
y | --
t | --
e | * -- *
s | --
) | *-- *
| -- *
| -- *
--------------------------------------->
time
Предположим, у вас есть таблица, содержащая данные гистограммы дампа кучи (сопоставление классов с тем, сколько памяти они потребляют):
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
);
Чтобы вычислить наклон для каждого класса, мы группируем по классу. Предложение HAVING> 0 гарантирует, что мы получим только кандидатов с положительным отскоком (линия вверх и влево). Мы сортируем по нисходящему склону, чтобы мы получили классы с наибольшим увеличением объема памяти вверху.
-- 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 ;
Выход:
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
Из вывода видно, что потребление памяти java.util.ArrayList увеличивается быстрее всего на 71.799 байт в секунду и потенциально является частью утечки памяти.