#SQLWednesday
👯♂️ Две таблицы заходят в бар… и нужно понять, чем они отличаются.
Классика собесов - сравнить два снапшота данных.
Есть таблицы:
• Customers_2024
• Customers_2025
Нужно:
1. Кто появился новым?
2. Кто удалился?
3. У кого изменились данные?
-- Новые клиенты (есть в 2025, нет в 2024)
SELECT c2025.id, c2025.name
FROM Customers_2025 c2025
LEFT JOIN Customers_2024 c2024 ON c2024.id = c2025.id
WHERE c2024.id IS NULL;
-- Удалённые клиенты (были, но пропали)
SELECT c2024.id, c2024.name
FROM Customers_2024 c2024
LEFT JOIN Customers_2025 c2025 ON c2025.id = c2024.id
WHERE c2025.id IS NULL;
-- Изменения в данных (id совпал, поля разные)
SELECT c2024.id,
c2024.name AS old_name,
c2025.name AS new_name
FROM Customers_2024 c2024
JOIN Customers_2025 c2025 ON c2025.id = c2024.id
WHERE c2024.name <> c2025.name; -- вот тут будет ошибка если NULL поэтому будьте аккуратны
Что тут важно:
• JOIN-ы вместо минусов - так быстрее и прозрачнее.
• Для сравнения всех полей можно собрать CHECKSUM(*) или HASHBYTES (SQL Server) / md5(row::text) (Postgres).
• Не забудьте про NULL: <> не работает, используйте IS DISTINCT FROM (Postgres) или EXCEPT для простого диффа.
Конечно все это уже давно решается с помощью SCD но это задача с собеседований на DE не редкость.
🔥 Такой «diff» помогает искать не только ошибки загрузки, но и баги в ETL, поэтому это валидно и для анализа и для DE.
#SQL #DataDiff #ETL #DataJungle