Агрегатные функции

Функции, вызывающие автоматическую агрегацию.

Подготовка данных

LOAD 'age';
SET search_path TO ag_catalog;

SELECT create_graph('graph_name');

SELECT * FROM cypher('graph_name', $$
        CREATE (a:Person {name: 'A', age: 13}),
        (b:Person {name: 'B', age: 33, eyes: "blue"}),
        (c:Person {name: 'C', age: 44, eyes: "blue"}),
        (d1:Person {name: 'D', eyes: "brown"}),
        (d2:Person {name: 'D'}),
        (a)-[:KNOWS]->(b),
        (a)-[:KNOWS]->(c),
        (a)-[:KNOWS]->(d1),
        (b)-[:KNOWS]->(d2),
        (c)-[:KNOWS]->(d2)
$$) as (a agtype);

min()

Функция min() возвращает наименьшее значение из набора значений.

Синтаксис: min(expression)

Возвращаемое значение:

Значение типа agtype — скалярное или список — в зависимости от результата выражения `expression`.

Параметры:

Имя Описание
expression Выражение, возвращающее коллекцию скаляров или списков типа agtype.

Примечания:

  • Значения null исключаются из расчёта.
  • В коллекциях смешанных типов:
    • Любая строка считается меньше любого числа.
    • Любой список считается меньше любой строки.
  • Списки сравниваются лексикографически: элементы сравниваются попарно слева направо в порядке возрастания.
  • min(null) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (v:Person)
    RETURN min(v.age)
$$) as (min_age agtype);

Возвращает минимальное значение среди всех значений свойства age.

Результат:

min_age
13
1 строка

Использование min() с массивами

Подготовка данных:
Для демонстрации следующего примера выполните три команды:

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:'d'})
$$) as (result agtype);

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:['a', 'b', 23]})
$$) as (result agtype);

SELECT * FROM cypher('graph_name', $$
    CREATE (:min_test {val:[1, 'b', 23]})
$$) as (result agtype);

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (v:min_test)
    RETURN min(v.val)
$$) as (min_val agtype);

Возвращает наименьшее значение в коллекции — в данном случае список ['a', 'b', 23], поскольку:
(i) оба списка имеют меньший приоритет по сравнению со строкой 'd', и
(ii) строка 'a' имеет меньший приоритет по сравнению с числом 1.

Результат:

min_val
["a", "b", 23]
1 строка

max()

Функция max() возвращает наибольшее значение из набора значений.

Синтаксис: max(expression)

Возвращаемое значение:

Значение типа agtype — скалярное или список — в зависимости от результата выражения `expression`.

Параметры:

Имя Описание
expression Выражение, возвращающее коллекцию скаляров или списков типа agtype.

Примечания:

  • Значения null исключаются из расчёта.
  • В коллекциях смешанных типов:
    • Любое число считается больше любой строки.
    • Любая строка считается больше любого списка.
  • Списки сравниваются лексикографически: элементы сравниваются попарно слева направо в порядке возрастания.
  • max(null) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN max(n.age)
$$) as (max_age agtype);

Возвращает максимальное значение среди всех значений свойства age.

Результат:

max_age
44
1 строка

stDev()

Функция stDev() возвращает выборочное стандартное отклонение множества значений. Используется стандартный двухпроходный алгоритм с делителем N − 1, подходящий для несмещённой оценки по выборке из генеральной совокупности. Для вычисления стандартного отклонения всей генеральной совокупности используйте stDevP().

Синтаксис: stDev(expression)

Возвращаемое значение:

Число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Числовое выражение типа agtype

Примечания:

  • Значения null исключаются из расчёта.
  • stDev(null) возвращает 0.0.

Запрос:

SELECT *
FROM cypher('graph_name', $$
   MATCH (n:Person)
   RETURN stDev(n.age)
$$) as (stdev_age agtype);

Возвращает выборочное стандартное отклонение значений свойства age.

Результат:

stdev_age
15.716233645501712
1 строка

stDevP()

Функция stDevP() возвращает стандартное отклонение генеральной совокупности множества значений. Используется стандартный двухпроходный алгоритм с делителем N, подходящий для вычисления стандартного отклонения всей совокупности. Для вычисления стандартного отклонения выборки из совокупности используйте stDev().

Синтаксис: stDevP(expression)

Возвращаемое значение:

Число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Числовое выражение типа agtype

Примечания:

  • Значения null исключаются из расчёта.
  • stDevP(null) возвращает 0.0.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN stDevP(n.age)
$$) as (stdevp_age agtype);

Возвращает стандартное отклонение генеральной совокупности значений свойства age.

Результат:

stdevp_age
12.832251036613439
1 строка

percentileCont()

Функция percentileCont() возвращает непрерывный процентиль множества значений. Аргумент процентиля должен находиться в диапазоне от 0.0 до 1.0. Применяется линейная интерполяция: если запрошенный процентиль находится между двумя значениями, вычисляется взвешенное среднее. Для округления до ближайшего существующего значения используйте percentileDisc().

Синтаксис: percentileCont(expression, percentile)

Возвращаемое значение:

Число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Числовое выражение типа agtype
percentile Числовое значение типа agtype от 0.0 до 1.0

Примечания:

  • Значения null исключаются из расчёта.
  • percentileCont(null, percentile) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN percentileCont(n.age, 0.4)
$$) as (percentile_cont_age agtype);

Возвращает 40-й процентиль значений свойства age, вычисленный методом линейной интерполяции.

Результат:

percentile_cont_age
29.0
1 строка

percentileDisc()

Функция percentileDisc() возвращает дискретный процентиль множества значений. Аргумент процентиля должен находиться в диапазоне от 0.0 до 1.0. Используется округление до ближайшего существующего значения. Для интерполированных результатов используйте percentileCont().

Синтаксис: percentileDisc(expression, percentile)

Возвращаемое значение:

Число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Числовое выражение типа agtype
percentile Числовое значение типа agtype от 0.0 до 1.0

Примечания:

  • Значения null исключаются из расчёта.
  • percentileDisc(null, percentile) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN percentileDisc(n.age, 0.5)
$$) as (percentile_disc_age agtype);

Возвращает 50-й процентиль (медиану) значений свойства age.

Результат:

percentile_disc_age
33.0
1 строка

count()

Функция count() возвращает количество значений или записей. Имеет две формы:

  • count(*) возвращает количество совпадающих записей.
  • count(expr) возвращает количество ненулевых значений, возвращённых выражением expr.

Синтаксис: count(expression)

Возвращаемое значение:

Целое число типа agtype.

Параметры:

Имя Описание
expression Любое выражение.

Примечания:

  • count(*) включает записи, которые могут дать null.
  • count(expr) исключает значения null.
  • count(null) возвращает 0.
  • count(*) можно использовать для подсчёта узлов; например, для подсчёта узлов, связанных с заданным узлом n.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[]->(x)
    RETURN n.age, count(*)
$$) as (age agtype, number_of_people agtype);

Возвращает значение свойства age начального узла n (где name = 'A') и количество узлов, связанных с n.

Результат:

age number_of_people
13 3
1 строка

С помощью count(*) также можно группировать и подсчитывать типы рёбер, получая количество для каждого типа.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[r]->()
    RETURN type(r), count(*)
$$) as (label agtype, count agtype);

Возвращает каждый тип отношения и его количество.

Результат:

label count
"KNOWS" 3
1 строка

Подсчёт значений с помощью count(expression)

Подсчёт фактических ненулевых значений, возвращённых выражением, может быть полезнее простого подсчёта записей с помощью count(*).

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n {name: 'A'})-[]->(x)
    RETURN count(x)
$$) as (count agtype);

Возвращает количество узлов, связанных с начальным узлом n.

Результат:

count
3
1 строка

Подсчёт ненулевых значений

Функция count(expression) подсчитывает только ненулевые значения, возвращённые выражением.

Запрос:

SELECT *
FROM cypher('graph_name', $$
    MATCH (n:Person)
    RETURN count(n.age)
$$) as (count agtype);

Возвращает количество узлов Person, у которых свойство age не равно null.

Результат:

count
3
1 строка

Подсчёт с дедупликацией и без неё

В этом примере находятся все друзья друзей и подсчитывается их количество:

  • count(DISTINCT friend_of_friend) подсчитывает каждый friend_of_friend только один раз, так как DISTINCT удаляет дубликаты.
  • count(friend_of_friend) подсчитывает повторяющиеся значения friend_of_friend несколько раз.

Запрос:

SELECT *
FROM cypher('graph_name', $$
        MATCH (me:Person)-[]->(friend:Person)-[]->(friend_of_friend:Person)
        WHERE me.name = 'A'
        RETURN count(DISTINCT friend_of_friend), count(friend_of_friend)
$$) as (friend_of_friends_distinct agtype, friend_of_friends agtype);

Узлы B и C связаны с D, поэтому D учитывается дважды при отсутствии DISTINCT.

Результат:

friend_of_friends_distinct friend_of_friends
1 2
1 строка

avg()

Функция avg() возвращает арифметическое среднее множества числовых значений.

Синтаксис: avg(expression)

Возвращаемое значение:

Целое число или число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Выражение, возвращающее набор чисел.

Примечания:

  • Значения null исключаются из расчёта.
  • avg(null) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN avg(n.age)
$$) as (avg_age agtype);

Возвращает среднее значение всех значений свойства age.

Результат:

avg_age
30.0
1 строка

sum()

Функция sum() возвращает сумму множества числовых значений.

Синтаксис: sum(expression)

Возвращаемое значение:

Число с плавающей точкой типа agtype.

Параметры:

Имя Описание
expression Выражение, возвращающее набор чисел.

Примечания:

  • Значения null исключаются из расчёта.
  • sum(null) возвращает null.

Запрос:

SELECT *
FROM cypher('graph_name', $$
MATCH (n:Person)
RETURN sum(n.age)
$$) as (total_age agtype);

Возвращает сумму всех значений свойства age.

Результат:

total_age
90
1 строка