Статистика по датам SQL: учёт null в MIN и MAX функциях

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для отображения NULL в функциях MIN или MAX воспользуйтесь функцией COALESCE. Она преобразует NULL в значения, пределы которых соответствуют вашему запросу. Для MIN используйте "крайне высокое" число, что принудит NULL принять наибольшее значение. Когда работаете с MAX, действуйте наоборот — вводите "чрезвычайно низкое" число.

Для значения минимума:

SQL
Скопировать код
SELECT MIN(COALESCE(column, 'крайне большое число')) FROM table;
-- 'Крайне большое число' замените на число, которое гарантированно больше любого значения в столбце.

Для значения максимума:

SQL
Скопировать код
SELECT MAX(COALESCE(column, 'крайне малое число')) FROM table;
-- 'Крайне малое число' замените на число, которое меньше всех возможных значений в столбце.

Убедитесь, что выбранные значения настолько экстремальны, что очевидно превышают разумный предел значений в вашем столбце.

Кинга Идем в IT: пошаговый план для смены профессии

Внимание к тонкостям

Заменяя NULL, убедитесь, что используемый тип данных совместим со значениями столбца. Например, в числовых столбцах заменяйте NULL числовыми границами:

SQL
Скопировать код
SELECT MIN(COALESCE(startDate, '19000101')) AS СамаяРанняяДата FROM вашаТаблица;
-- Для столбцов с датами '19000101' может служить ранней границей

Если NULL указывает на неоконченный период, функция GETDATE() может предоставить актуальную верхнюю границу:

SQL
Скопировать код
SELECT MAX(COALESCE(endDate, GETDATE())) AS СамаяПоздняяДата FROM вашаТаблица;
-- Воспринимайте NULL как "текущее время", что обозначит сегодняшнюю дату.

Группировка с учетом NULL

При использовании GROUP BY совместно с MIN и MAX следует быть осторожным, чтобы NULL не искажал результаты. Группируйте данные по ключевому полю для корректной обработки NULL:

SQL
Скопировать код
SELECT RecordID, MIN(COALESCE(startDate, '19000101')), MAX(COALESCE(endDate, GETDATE()))
FROM вашаТаблица
GROUP BY RecordID; -- В каждой группе NULL рассматривается как значимое значение.

Такой подход сохраняет телесность данных и учитывает значения NULL при расчетах в группах.

Визуализация

Отображение процесса включения значений NULL в функции MIN или MAX можно представить как ступеньки:

СтупеньВысота
№15 см
№2NULL<-- Эта ступень не видна, но на самом деле это уровень пола (0 см)!
№310 см

Считая невидимую ступеньку (NULL) нулевой отметкой, мы можем учесть ее:

SQL
Скопировать код
SELECT MIN(COAALESCE(Высота, 0)) as НаименьшаяВысотаСтупеньки FROM Лестница;
-- Таким образом, мы учитываем и скрытую ступеньку.

Или когда требуется найти самую низкую точку:

Самая нижняя точка 📉:

|   |   
|   | №3
|   | №3   
| №2| №1 
|___|___|

COALESCE заменяет невидимую ступеньку NULL на действительное значение (0 см), включая ее в расчет MIN.

Переходим к альтернативам

NULLIF в арсенале

Используйте NULLIF для исключения определенных значений из MIN или MAX. Если они соответствуют определенному значению, они преобразуются в NULL:

SQL
Скопировать код
SELECT MIN(NULLIF(столбец, 'значение для исключения')) FROM таблица;
-- Таким образом, мы исключаем 'значение для исключения' из учета при определении минимума.

Счет идет на подсчет

COUNT(столбец) подсчитывает только не-NULL значения, в то время как COUNT(*) учитывает все записи:

SQL
Скопировать код
SELECT
    COUNT(endDate), -- Только цифровые значения, исключая NULL
    COUNT(*) -- Все записи, включая NULL
FROM вашаТаблица;

Вызовем операторы CASE

CASE может быть полезным при учете NULL в расчетах в сложных условиях:

SQL
Скопировать код
SELECT 
    MIN(CASE WHEN column IS NULL THEN 'замещающее значение' ELSE column END) 
FROM table; -- С 'CASE' легко управлять обработкой NULL.

Полезные материалы

  1. Разбор различий и производительности между ISNULL и COALESCE на Stack Overflow.
  2. Изучение функции MAX() на W3Schools и способов обхода значения NULL.
  3. Изучение функции MIN() на W3Schools и влияние NULL на SQL-запросы.
  4. Другие способы управления NULL значениями с помощью CASE на сайте Essential SQL.