← Все курсы · Курс SQL

Проверки качества данных должны выполняться до того, как кто-либо увидит цифры

Майкл Носито · Обновлено в августе 2026 г. · Все числа на этой странице были обработаны до их публикации.

У каждого аналитика случалась встреча, на которой кто-то другой обнаружил ошибку. Это почти никогда не бывает тонким. Это дублированный ключ, отсутствующая неделя или категория, переименованная в исходном коде, и все они выявляются проверками, выполнение которых занимает десять минут.

Что вы делаете: запускаете эти восемь, прежде чем что-либо создавать, сохраняете результаты и сравниваете их с последним запуском.

Краткая версия. Десять минут в начале всегда лучше часа на совещании.

1. Подсчет строк по источнику

SELECT COUNT(*) FROM orders;

Сравните с собственным счетом исходной системы. Это самая ценная проверка, которую чаще всего пропускают. Он обнаруживает обрезанные файлы, неудачные загрузки и фильтр, добавленный кем-то в прошлом месяце. Версия той же ловушки в Excel находится в предел строки: файл, обрезанный на 1 048 576 строк, выглядит совершенно нормально.

2. Действительно ли ключ уникален?

SELECT order_id, COUNT(*) AS n
FROM orders
GROUP BY order_id
HAVING COUNT(*) > 1
ORDER BY n DESC;

Если это что-то возвращает, каждое соединение через order_id умножает строки, и каждая следующая сумма увеличивается. Проверьте ключ, по которому вы собираетесь присоединиться, а не только первичный ключ, поскольку ключ соединения часто представляет собой бизнес-столбец без каких-либо ограничений.

3. Нулевые значения в столбце

SELECT COUNT(*) AS rows,
       SUM(CASE WHEN region   IS NULL THEN 1 ELSE 0 END) AS null_region,
       SUM(CASE WHEN amount   IS NULL THEN 1 ELSE 0 END) AS null_amount,
       SUM(CASE WHEN order_dt IS NULL THEN 1 ELSE 0 END) AS null_date
FROM orders;

Важно не сегодняшнее число, а изменение с момента последней загрузки. Столбец, в котором всегда было 2 процента нулевых значений, а затем внезапно стал нулевым 30 процентов, означает, что что-то изменилось в восходящем направлении, и никто вам об этом не сообщит.

4. Диапазоны и невозможные значения

SELECT MIN(amount), MAX(amount), AVG(amount),
       SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END) AS negatives,
       SUM(CASE WHEN amount = 0 THEN 1 ELSE 0 END) AS zeros
FROM orders;

Найдите значения-заполнители, которые системы используют для отсутствующих: -1, 0, 999, 9999 и дату 1900-01-01. Каждый из них будет усреднен в ваших результатах, как если бы он был реальным. Число 99 999 не является выбросом, это соглашение о вводе данных.

5. Разумное свидание

SELECT MIN(order_dt), MAX(order_dt) FROM orders;

SELECT strftime('%Y-%m', order_dt) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

Второй запрос следует внимательно прочитать. Пропущенный месяц или месяц с десятой частью обычного объема – это скорее провальная загрузка, чем период затишья в торговле. Будущие даты и даты до существования бизнеса указывают на проблемы синтаксического анализа, обычно файл с первым днем ​​читается как первый с месяца.

6. Ссылочная целостность

SELECT COUNT(*) AS orphan_orders
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM customers c
                  WHERE c.customer_id = o.customer_id);

Сироты исчезают из любого внутреннего объединения, молча, забирая с собой свои доходы. Вот почему два отчета по одним и тем же данным могут отличаться на несколько процентов, причем ни один из них не является явно ошибочным. NOT EXISTS скорее, чем NOT IN, по причине NULL в анти-соединение.

7. Смещение категории

SELECT region, COUNT(*) FROM orders GROUP BY region ORDER BY 2 DESC;

Прочтите весь список, включая небольшие значения внизу. Новые категории появляются при перенастройке системы; старые перестают появляться, когда происходит переименование вверх по течению. В сгруппированном отчете будут показаны две строки там, где должна быть одна, и это будет выглядеть как настоящее разделение.

8. Сверьте одну сумму с чем-то внешним

Финансовая книга, опубликованный отчет за прошлый месяц, собственная информационная панель исходной системы. Один номер, договорились до копейки или объяснили. Все вышеперечисленное проверяет данные на себе; это единственная проверка, которая проверяет его на соответствие миру.

Сохраняйте результаты, а не просто читайте их. Запишите каждый прогон в небольшую таблицу с отметкой времени. Ценность этих проверок — в сравнении прогонов, и число, которое вы сразу посмотрели и не сохранили, невозможно ни с чем сравнить.

Десятиминутная рутина

#ПроверитьСбой, когда
1Количество строкЗагрузка сокращена или отфильтрована
2Ключевая уникальностьОбъединения будут разветвляться
3Нулевые ставкиПоле вверх по течению перестало заполняться
4ДиапазоныЗаполнители рассматриваются как значения
5Диапазон дат и количество месяцевПропущена точка, плохой синтаксический анализ
6СиротыСтроки исчезают при объединении
7Список категорийПереименование разделяет группу на две части
8Внешнее примирениеВсе внутри согласилось и все еще было неправильным

Как применить это в своей работе

  1. Сохраните восемь запросов как один сценарий для каждого источника с заполненными именами таблиц.
  2. Запускайте его до начала сборки, а не после того, как кто-то задаст вопрос.
  3. Запишите результаты в таблицу журнала с указанием даты, чтобы стало видно отклонение.
  4. Поместите количество строк и сверку в сам отчет в виде сноски. Это меняет способ получения отчета.
  5. Если проверка не удалась, сообщите об этом владельцу источника. Тихие обходные пути означают, что один и тот же сбой происходит каждый месяц навсегда.

Единственная привычка, которую нужно сохранить

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

Какой из этих восьми не сработает с данными, которые вы использовали в последний раз?

Каждый запрос здесь был написан для выполнения. Функции даты — SQLite; используйте DATE_TRUNC в Постгрес, FORMAT или CONVERT в SQL Server и DATE_FORMAT в MySQL.
Ошибки, портящие репутацию, — это обычные ошибки, обнаруженные кем-то другим.

SQL для аналитиков — это 458 страниц, которые считывают запросы построчно в повседневных словах, поэтому ошибочный результат нужно где-то отслеживать, а не перепечатывать, пока он не станет выглядеть лучше.

SQL для аналитиков, 19 $ →
Запускайте их перед отчетом, а не после вопроса.

Профилирование исходной системы это более глубокая версия тех же проверок, и Исследовательский анализ данных это то, что вы делаете, когда данные проходят мимо них.

Читать «Профилирование источника» →