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
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-задачи в тренажёре →
Спрашивают в задачах на абсолютную ошибку прогноза, MAE/MAD и отклонения в A/B. Часто идёт в паре с SIGN (когда нужны и величина, и знак) и с AVG (AVG(ABS(...)) = средняя абсолютная ошибка).
ABS отбрасывает знак и возвращает только величину: ABS(−7) = 7. SIGN, наоборот, отбрасывает величину и возвращает только знак: SIGN(−7) = −1. Их часто используют вместе: ABS — для размера отклонения, SIGN — для его направления.
ABS(NULL) вернёт NULL, потому что модуль неизвестного значения тоже неизвестен. Если нужен ноль вместо NULL, оберните в COALESCE: COALESCE(ABS(x), 0). Это типичная причина «пропавших» строк при последующей фильтрации по результату.
Да, и в отличие от FLOOR/CEIL/SQRT, ABS — это ядерная функция SQLite, доступная всегда, без математического расширения. Она есть во всех сборках и во всех диалектах (PostgreSQL, MySQL, SQLite) с одинаковым поведением. Единственный нюанс SQLite — overflow на минимальном 64-битном integer.
COALESCE · NULLIF · STRING_AGG · COUNT · SUM OVER · CAST
Открыть SQL-тренажёр (565 задач) →