Spec-Zone.ru › SQLite

Встроенные агрегатные функции

1. Синтаксис

вызов-функции-агрегации:

функция-агрегации ( УНИКАЛЬНЫЕ выражение ) условие-фильтра , * СОРТИРОВКА ПО свойство-сортировки ,

выражение:

литеральное значение параметр привязки имя схемы . имя таблицы . имя столбца унарный оператор выражение выражение бинарный оператор выражение имя функции ( аргументы функции ) фильтрующее предложение над предложением ( выражение ) , CAST ( выражение AS имя типа
) expr COLLATE имя_сортировки expr НЕ СХОДСТВО GLOB REGEXP СОПОСТАВЛЕНИЕ expr expr ESCAPE expr expr ISNULL NOTNULL НЕ NULL expr ЯВЛЯЕТСЯ НЕ РАЗЛИЧНЫМИ ИЗ expr
expr НЕ МЕЖДУ expr И expr expr НЕ В ( запрос-выбор ) expr , имя-схемы . функция-таблицы ( expr ) название-таблицы , НЕ СУЩЕСТВУЕТ ( запрос-выбор )
СЛУЧАЙ expr КОГДА expr ТОГДА expr ИНАЧЕ expr КОНЕЦ функция-возвращаемое значение

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

УНИКАЛЬНЫЕ expr , * ПОРЯДОК ПО условие-сортировки ,

буквальное значение:

CURRENT_TIMESTAMP numeric-literal string-literal blob-literal NULL TRUE FALSE CURRENT_TIME CURRENT_DATE

over-оператор:

ПЕРЕД имя-окна ( имя-окна-по-умолчанию РАЗДЕЛЁННЫЙ ПО выражение , ПОРЯДОК ПО термин-упорядочивания , спецификация-кадра )

спецификация-кадра:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫЙ ПРЕДШЕСТВУЮЩИЙ И НЕОГРАНИЧЕННЫЙ СЛЕДУЮЩИЙ ДΙΑПАЗОН СТРОКИ НЕОГРАНИЧЕННЫЙ ПРЕДШЕСТВУЮЩИЙ expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЙ expr ПРЕДШЕСТВУЮЩИЙ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЙ
ИСКЛЮЧИТЬ ТЕКУЩИЙ СТРОКА ИСКЛЮЧИТЬ ГРУППА ИСКЛЮЧИТЬ СВЯЗИ ИСКЛЮЧИТЬ НЕТ ДРУГИЕ

raise-function:

ВЫЗОВ ( ОТКАТ , сообщение_об_ошибке ) ИГНОРИРОВАТЬ ОСТАНОВКА ПРОВАЛ

select-stmt:

С РЕКУРСИВНАЯ common-table-expression , ВЫБРАТЬ УНИКАЛЬНЫЕ столбец_результата , ВСЕ ИЗ таблицы_или_подзапроса условие_соединения , ГДЕ выражение ГРУППИРОВАТЬ ПО выражение ПРИ_УСЛОВИИ выражение ,
ОКОНЬ имя-окна КАК определение-окна , ЗНАЧЕНИЯ ( выражение ) , , составной-оператор select-core СОРТИРОВКА ПО ОГРАНИЧЕНИЕ выражение элемент-сортировки , СМЕЩЕНИЕ выражение , выражение

общее-выражение-с-таблицей:

имя_таблицы ( имя_столбца ) AS НЕ МАТЕРИАЛИЗОВАННЫЙ ( запрос_выбора ) ,

сложный_оператор:

ОБЪЕДИНЕНИЕ ОБЪЕДИНЕНИЕ ПЕРЕСЕЧЕНИЕ ИСКЛЮЧЕНИЕ ВСЕ

строка_соединения:

table-or-subquery join-operator table-or-subquery join-constraint

join-constraint:

USING ( column-name ) , ON expr

join-operator:

NATURAL LEFT OUTER JOIN , RIGHT FULL INNER CROSS

result-column:

expr AS имя_колонки * имя_таблицы . *

таблица-или-подзапрос:

schema-name . table-name AS table-alias INDEXED BY index-name NOT INDEXED table-function-name ( expr ) , AS table-alias ( select-stmt ) ( table-or-subquery ) ,
join-clause

window-defn:

( base-window-name PARTITION BY expr , ORDER BY ordering-term , frame-spec )

frame-spec:

ГРУППЫ МЕЖДУ НЕОГРАНИЧЕННЫЕ ПРЕДШЕСТВУЮЩИЕ И НЕОГРАНИЧЕННЫЕ СЛЕДУЮЩИЕ ДИАПАЗОН СТРОКИ НЕОГРАНИЧЕННЫЕ ПРЕДШЕСТВУЮЩИЕ expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩИЙ СТРОКА expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЕ expr ПРЕДШЕСТВУЮЩИЕ ТЕКУЩИЙ СТРОКА expr СЛЕДУЮЩИЕ
EXCLUDE CURRENT ROW EXCLUDE GROUP EXCLUDE TIES EXCLUDE NO OTHERS

type-name:

name ( signed-number , signed-number ) ( signed-number )

signed-number:

+ numeric-literal -

signed-number:

+ numeric-literal -

filter-clause:

FILTER ( WHERE expr )

ordering-term:

expr COLLATE collation-name DESC ASC NULLS FIRST NULLS LAST

Приведенные ниже агрегатные функции доступны по умолчанию. Ещё две агрегатные функции сгруппированы с функциями JSON SQL. Приложения могут определять пользовательские агрегатные функции с помощью интерфейса sqlite3_create_function(). API.

В любой агрегатной функции, которая принимает один аргумент, перед этим аргументом может стоять ключевое слово DISTINCT. В таких случаях дубликаты фильтруются перед передачей в агрегатную функцию. Например, функция "count(distinct X)" вернет количество различных значений столбца X, а не общее количество ненулевых значений в столбце X.

Если предоставлено предложение FILTER, то в агрегат включаются только строки, для которых expr истинно.

Если предоставлено предложение ORDER BY, это предложение определяет порядок, в котором обрабатываются входные данные агрегата. Для агрегатных функций, таких как max() и count(), порядок ввода не имеет значения. Но для таких функций, как string_agg() и json_group_object(), предложение ORDER BY повлияет на результат. Если предложение ORDER BY не указано, входные данные агрегата поступают в произвольном порядке, который может меняться от одного вызова к другому.

См. также: скалярные функции и функции окна.

2. Список встроенных агрегатных функций

  • avg(X)
  • count(*)
  • count(X)
  • group_concat(X)
  • group_concat(X,Y)
  • max(X)
  • min(X)
  • string_agg(X,Y)
  • sum(X)
  • total(X)

3. Описание встроенных агрегатных функций

avg(X)

Функция avg() возвращает среднее значение всех не-NULL значений X в группе. Строковые и BLOB-значения, которые не выглядят как числа, интерпретируются как 0. Результат avg() всегда является значением с плавающей точкой, если имеется хотя бы один не-NULL вход, даже если все входы являются целыми числами. Результат avg() равен NULL, если нет не-NULL входов. Результат avg() вычисляется как total()/count(), поэтому все ограничения, которые применяются к total(), также применяются к avg().

count(X)
count(*)

Функция count(X) возвращает количество раз, когда X не равно NULL в группе. Функция count(*) (без аргументов) возвращает общее количество строк в группе.

group_concat(X)
group_concat(X,Y)
string_agg(X,Y)

Функция group_concat() возвращает строку, которая является конкатенацией всех не-NULL значений X. Если параметр Y присутствует, он используется в качестве разделителя между экземплярами X. В противном случае в качестве разделителя используется запятая (,).

Функция string_agg(X,Y) является псевдонимом для group_concat(X,Y). Функция string_agg() совместима с PostgreSQL и SQL-Server, а group_concat() — с MySQL.

Порядок конкатенированных элементов произвольный, если не указан аргумент ORDER BY сразу после последнего параметра.

max(X)

Агрегатная функция max() возвращает максимальное значение всех значений в группе. Максимальное значение — это значение, которое было бы возвращено последним в ORDER BY для того же столбца. Агрегатная функция max() возвращает NULL тогда и только тогда, когда в группе нет не-NULL значений.

min(X)

Агрегатная функция min() возвращает минимальное не-NULL значение всех значений в группе. Минимальное значение — это первое не-NULL значение, которое появилось бы в ORDER BY столбца. Агрегатная функция min() возвращает NULL тогда и только тогда, когда в группе нет не-NULL значений.

sum(X)
total(X)

Агрегатные функции sum() и total() возвращают сумму всех не-NULL значений в группе. Если нет строк с не-NULL входом, то sum() возвращает NULL, а total() возвращает 0.0. NULL обычно не является полезным результатом для суммы по нулю строк, но стандарт SQL требует этого, и большинство других баз данных SQL реализуют sum() таким образом, поэтому SQLite делает то же самое, чтобы обеспечить совместимость. Нестандартная функция total() предоставлена для удобства работы вокруг этой проблемы проектирования в языке SQL.

Результат total() всегда является значением с плавающей точкой. Результат sum() является целым числом, если все не-NULL входные данные являются целыми числами. Если какой-либо вход в sum() не является целым числом или NULL, то sum() возвращает значение с плавающей точкой, которое является приближением математической суммы.

Функция sum() выбросит исключение "переполнение целого числа", если все входные данные являются целыми числами или NULL, и переполнение целого числа происходит в любой момент во время вычисления. Ошибка переполнения никогда не возникает, если любой предыдущий вход был значением с плавающей точкой. Функция total() никогда не выдает ошибку переполнения.

При суммировании значений с плавающей точкой, если величины значений сильно различаются, полученная сумма может быть неточной из-за того, что значения с плавающей точкой IEEE 754 являются приближениями. Используйте агрегатную функцию decimal_sum(X) в расширении десятичных чисел, чтобы получить точную сумму чисел с плавающей точкой. Рассмотрим такой тестовый случай:

CREATE TABLE t1(x REAL);
INSERT INTO t1 VALUES(1.55e+308),(1.23),(3.2e-16),(-1.23),(-1.55e308);
SELECT sum(x), decimal_sum(x) FROM t1;

Большие значения ±1.55e+308 взаимно уничтожаются, но аннулирование не происходит до конца суммирования, и тем временем большое значение +1.55e+308 заглушает значение 3.2e-16. В итоге получается неточный результат для sum(). Функция decimal_sum() генерирует точный ответ, ценой дополнительных затрат процессора и памяти. Обратите внимание также, что decimal_sum() не входит в ядро SQLite; это загружаемое расширение.

Если сумма входных данных слишком велика, чтобы быть представленной как значение с плавающей точкой IEEE 754, то может быть возвращен результат +Бесконечность или -Бесконечность. Если используются очень большие значения с разными знаками, так что функция SUM() или TOTAL() не может определить, является ли правильным результатом +Бесконечность, -Бесконечность или какое-либо другое значение между ними, то результатом является NULL. Например, следующий запрос возвращает NULL:

WITH t1(x) AS (VALUES(1.0),(-9e+999),(2.0),(+9e+999),(3.0))
 SELECT sum(x) FROM t1;

Последнее изменение этой страницы: 05.12.2023 14:43:20 UTC

SQLite is in the Public Domain.
https://sqlite.org/lang_aggfunc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API