SELECT amount,
FLOOR(amount) AS floor_amount,
CEIL(amount) AS ceil_amount
FROM payments
LIMIT 3;
Результат:
amount | floor_amount | ceil_amount 1490.20 | 1490 | 1491 999.90 | 999 | 1000 -50.50 | -51 | -50
SELECT FLOOR(amount / 1000) * 1000 AS bucket,
COUNT(*) AS payments
FROM payments
GROUP BY FLOOR(amount / 1000) * 1000
ORDER BY bucket;
Результат:
bucket | payments
0 | 120
1000 | 58
2000 | 14
SELECT CEIL(COUNT(*) / 50.0) AS pages
FROM orders;
Результат:
pages 37Порешать SQL-задачи в тренажёре →
На собеседовании всплывает в задачах на гистограммы, бины и пагинацию («разложите суммы по диапазонам»). Идёт в паре с ROUND, TRUNC и целочисленным делением.
FLOOR всегда округляет вниз (к −∞), ROUND — к ближайшему целому по правилам округления, TRUNC просто отбрасывает дробную часть в сторону нуля. Для положительных чисел FLOOR и TRUNC совпадают, а для отрицательных нет: FLOOR(−2.3) = −3, TRUNC(−2.3) = −2. Выбирайте функцию под смысл: бины — FLOOR, обрезка — TRUNC.
FLOOR(−2.1) = −3, потому что округление идёт к меньшему числу. CEIL(−2.1) = −2, потому что вверх, то есть к большему. Это частая ловушка: для отрицательных значений FLOOR даёт результат «дальше от нуля», а CEIL — «ближе к нулю».
Да, но это функции математического расширения, добавленного в SQLite 3.35 (2021) и включаемого флагом сборки SQLITE_ENABLE_MATH_FUNCTIONS. В официальных предсобранных бинарниках оно активно, так что floor(), ceil() и ceiling() работают. Но ABS и ROUND — ядерные и доступны всегда, а FLOOR/CEIL могут отсутствовать в кастомной сборке без математики.
STRING_AGG · COUNT · SUM OVER · ROUND · UPPER / LOWER · LENGTH
Открыть SQL-тренажёр (565 задач) →