Встроенные агрегатные функции
1. Синтаксис
Приведенные ниже агрегатные функции доступны по умолчанию. Ещё две агрегатные функции сгруппированы с функциями 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. Список встроенных агрегатных функций
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