ABS в SQL: абсолютное значение (модуль) числа

ABS(x) возвращает абсолютное значение — то же число, но всегда без знака (модуль). Аналитику это нужно, когда важна величина отклонения, а не его направление: насколько факт разошёлся с планом, какова абсолютная ошибка прогноза, среднее абсолютное отклонение (MAD/MAE). Это одна из немногих математических функций, которая есть в ядре всех диалектов — PostgreSQL, MySQL и SQLite, — так что кроссдиалектных сюрпризов почти нет.

Синтаксис

ABS(numeric_expression)

Примеры использования

Пример 1: Абсолютное расхождение факта и ожидания

SELECT order_id,
       expected_total,
       actual_total,
       ABS(actual_total - expected_total) AS diff
FROM orders
LIMIT 3;

Результат:

order_id | expected_total | actual_total | diff
   1001  |          1500  |        1440  |   60
   1002  |           800  |         860  |   60
   1003  |          2000  |        2000  |    0

Пример 2: Аномалии по модулю отклонения

SELECT event_id, delta
FROM events
WHERE ABS(delta) > 100
ORDER BY ABS(delta) DESC;

Результат:

event_id | delta
   77    |  -540
   12    |   310
   90    |  -180
Порешать SQL-задачи в тренажёре →

Типичная ошибка

ABS(NULL) возвращает NULL, а не 0 — учитывайте это в фильтрах и суммах. Тип аргумента сохраняется, и на границе диапазона возможен overflow: ABS(-9223372036854775808) (минимальный 64-битный integer) выбрасывает ошибку в SQLite и «integer out of range» в PostgreSQL, потому что положительного двойника у этого числа нет — приведите к bigint/numeric.

Где спрашивают на собеседовании

Спрашивают в задачах на абсолютную ошибку прогноза, MAE/MAD и отклонения в A/B. Часто идёт в паре с SIGN (когда нужны и величина, и знак) и с AVG (AVG(ABS(...)) = средняя абсолютная ошибка).

FAQ: частые вопросы про ABS

Чем ABS отличается от SIGN?

ABS отбрасывает знак и возвращает только величину: ABS(−7) = 7. SIGN, наоборот, отбрасывает величину и возвращает только знак: SIGN(−7) = −1. Их часто используют вместе: ABS — для размера отклонения, SIGN — для его направления.

Что вернёт ABS от NULL?

ABS(NULL) вернёт NULL, потому что модуль неизвестного значения тоже неизвестен. Если нужен ноль вместо NULL, оберните в COALESCE: COALESCE(ABS(x), 0). Это типичная причина «пропавших» строк при последующей фильтрации по результату.

Поддерживается ли ABS в SQLite?

Да, и в отличие от FLOOR/CEIL/SQRT, ABS — это ядерная функция SQLite, доступная всегда, без математического расширения. Она есть во всех сборках и во всех диалектах (PostgreSQL, MySQL, SQLite) с одинаковым поведением. Единственный нюанс SQLite — overflow на минимальном 64-битном integer.

Задачи в тренажёре по теме

Смежные темы SQL

Агрегации · null-handling

Другие функции SQL

COALESCE · NULLIF · STRING_AGG · COUNT · SUM OVER · CAST

Открыть SQL-тренажёр (565 задач) →