Статистика по датам SQL: учёт null в MIN и MAX функциях
Быстрый ответ
Для отображения NULL
в функциях MIN
или MAX
воспользуйтесь функцией COALESCE
. Она преобразует NULL
в значения, пределы которых соответствуют вашему запросу. Для MIN
используйте "крайне высокое" число, что принудит NULL
принять наибольшее значение. Когда работаете с MAX
, действуйте наоборот — вводите "чрезвычайно низкое" число.
Для значения минимума:
SELECT MIN(COALESCE(column, 'крайне большое число')) FROM table;
-- 'Крайне большое число' замените на число, которое гарантированно больше любого значения в столбце.
Для значения максимума:
SELECT MAX(COALESCE(column, 'крайне малое число')) FROM table;
-- 'Крайне малое число' замените на число, которое меньше всех возможных значений в столбце.
Убедитесь, что выбранные значения настолько экстремальны, что очевидно превышают разумный предел значений в вашем столбце
.
Внимание к тонкостям
Заменяя NULL
, убедитесь, что используемый тип данных совместим со значениями столбца. Например, в числовых столбцах заменяйте NULL
числовыми границами:
SELECT MIN(COALESCE(startDate, '19000101')) AS СамаяРанняяДата FROM вашаТаблица;
-- Для столбцов с датами '19000101' может служить ранней границей
Если NULL
указывает на неоконченный период, функция GETDATE()
может предоставить актуальную верхнюю границу:
SELECT MAX(COALESCE(endDate, GETDATE())) AS СамаяПоздняяДата FROM вашаТаблица;
-- Воспринимайте NULL как "текущее время", что обозначит сегодняшнюю дату.
Группировка с учетом NULL
При использовании GROUP BY
совместно с MIN
и MAX
следует быть осторожным, чтобы NULL
не искажал результаты. Группируйте данные по ключевому полю для корректной обработки NULL
:
SELECT RecordID, MIN(COALESCE(startDate, '19000101')), MAX(COALESCE(endDate, GETDATE()))
FROM вашаТаблица
GROUP BY RecordID; -- В каждой группе NULL рассматривается как значимое значение.
Такой подход сохраняет телесность данных и учитывает значения NULL
при расчетах в группах.
Визуализация
Отображение процесса включения значений NULL
в функции MIN
или MAX
можно представить как ступеньки:
Ступень | Высота | |
---|---|---|
№1 | 5 см | |
№2 | NULL | <-- Эта ступень не видна, но на самом деле это уровень пола (0 см)! |
№3 | 10 см |
Считая невидимую ступеньку (NULL) нулевой отметкой, мы можем учесть ее:
SELECT MIN(COAALESCE(Высота, 0)) as НаименьшаяВысотаСтупеньки FROM Лестница;
-- Таким образом, мы учитываем и скрытую ступеньку.
Или когда требуется найти самую низкую точку:
Самая нижняя точка 📉:
| |
| | №3
| | №3
| №2| №1
|___|___|
COALESCE
заменяет невидимую ступеньку NULL
на действительное значение (0 см), включая ее в расчет MIN
.
Переходим к альтернативам
NULLIF в арсенале
Используйте NULLIF
для исключения определенных значений из MIN
или MAX
. Если они соответствуют определенному значению, они преобразуются в NULL
:
SELECT MIN(NULLIF(столбец, 'значение для исключения')) FROM таблица;
-- Таким образом, мы исключаем 'значение для исключения' из учета при определении минимума.
Счет идет на подсчет
COUNT(столбец)
подсчитывает только не-NULL значения, в то время как COUNT(*)
учитывает все записи:
SELECT
COUNT(endDate), -- Только цифровые значения, исключая NULL
COUNT(*) -- Все записи, включая NULL
FROM вашаТаблица;
Вызовем операторы CASE
CASE
может быть полезным при учете NULL
в расчетах в сложных условиях:
SELECT
MIN(CASE WHEN column IS NULL THEN 'замещающее значение' ELSE column END)
FROM table; -- С 'CASE' легко управлять обработкой NULL.
Полезные материалы
- Разбор различий и производительности между
ISNULL
иCOALESCE
на Stack Overflow. - Изучение функции
MAX()
на W3Schools и способов обхода значенияNULL
. - Изучение функции
MIN()
на W3Schools и влияниеNULL
на SQL-запросы. - Другие способы управления
NULL
значениями с помощьюCASE
на сайте Essential SQL.