Поиск…


Простая статистика: 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 байт в секунду и потенциально является частью утечки памяти.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow