Данные: структурированные и не очень
Структурированные данные имеют строгую, заранее определённую структуру и типы данных (например, числовые или текстовые), что позволяет их легко фильтровать и анализировать.
Основные характеристики:
– Фиксированная схема
– Табличный формат
– Четко определенные типы данных
– Легко анализируются
Пример структурированных данных (таблица "Клиенты"):
Структурированные данные особенно полезны, когда требуется быстрый доступ к информации и её анализ.
А вот с полуструктурированными данными не всё так просто. У них есть структура, но она более гибкая и не такая строгая. То есть параметры объектов могут меняться или отсутствовать.
Ключевые особенности:
– Гибкая схема
– Иерархическая структура
– Возможность хранения разнородных данных
– Поддержка вложенности
Пример полуструктурированных данных (JSON):
Кроме JSON, существуют и другие форматы полуструктурированных данных, такие как XML, YAML и другие. Полуструктурированные данные часто используются в современных веб-приложениях, системах управления контентом, а также в REST API для обмена информацией между различными системами.
Ну и не стоит забывать о неструктурированных данных. Это то, что не укладывается в таблицы в привычном виде — например, текстовые документы, изображения или видео. Они сложнее в обработке и анализе, но тоже могут быть полезными. Для работы с ними часто используются технологии машинного обучения, обработки естественного языка (NLP) и распознавания изображений.
В современных системах часто используется комбинация всех трех типов данных. Например, интернет-магазин может хранить информацию о клиентах в таблицах, данные о заказах — в JSON, а отзывы — как тексты или изображения. Такой подход позволяет системе быть гибкой и эффективной. Ну а нам с вами, при построении хранилищ данных, нужно уметь всё это грамотно реплицировать и приводить в порядок для последующего анализа.
#dwh
Структурированные данные имеют строгую, заранее определённую структуру и типы данных (например, числовые или текстовые), что позволяет их легко фильтровать и анализировать.
Основные характеристики:
– Фиксированная схема
– Табличный формат
– Четко определенные типы данных
– Легко анализируются
Пример структурированных данных (таблица "Клиенты"):
| customer_id | first_name | last_name | registration_date |
|-------------|------------|------------|-------------------|
| 001 | Иван | Иванов | 2023-01-15 |
| 002 | Мария | Смирнова | 2023-09-20 |
| 003 | Алексей | Петров | 2023-03-10 |
Структурированные данные особенно полезны, когда требуется быстрый доступ к информации и её анализ.
А вот с полуструктурированными данными не всё так просто. У них есть структура, но она более гибкая и не такая строгая. То есть параметры объектов могут меняться или отсутствовать.
Ключевые особенности:
– Гибкая схема
– Иерархическая структура
– Возможность хранения разнородных данных
– Поддержка вложенности
Пример полуструктурированных данных (JSON):
{
"order": {
"id": 1001,
"customer": {
"inn": "7707083893",
"name": "ООО Ромашка",
"contactPerson": "Иванов Иван Иванович"
},
"items": [
{"name": "Смартфон Yota Phone", "quantity": 1, "price": 49999.99},
{"name": "Защитное стекло", "quantity": 2, "price": 999.99}
],
"delivery": {
"address": "г. Москва, ул. Тверская, д. 1",
"method": "СДЭК",
"cost": 500.00
},
"total": 52499.97,
"status": "Отправлен"
}
}
Кроме JSON, существуют и другие форматы полуструктурированных данных, такие как XML, YAML и другие. Полуструктурированные данные часто используются в современных веб-приложениях, системах управления контентом, а также в REST API для обмена информацией между различными системами.
Ну и не стоит забывать о неструктурированных данных. Это то, что не укладывается в таблицы в привычном виде — например, текстовые документы, изображения или видео. Они сложнее в обработке и анализе, но тоже могут быть полезными. Для работы с ними часто используются технологии машинного обучения, обработки естественного языка (NLP) и распознавания изображений.
В современных системах часто используется комбинация всех трех типов данных. Например, интернет-магазин может хранить информацию о клиентах в таблицах, данные о заказах — в JSON, а отзывы — как тексты или изображения. Такой подход позволяет системе быть гибкой и эффективной. Ну а нам с вами, при построении хранилищ данных, нужно уметь всё это грамотно реплицировать и приводить в порядок для последующего анализа.
#dwh
❤1🤯1
3НФ: спасаемся от хаоса в данных
В прошлый раз мы поговорили про 1 и 2НФ, пора двигаться дальше.
Третья нормальная форма (3НФ) — один из ключевых этапов нормализации данных, который помогает избежать избыточности и аномалий при обновлении информации.
Как следует из определения, чтобы отношение находилось в 3НФ, оно должно удовлетворять двум условиям:
1. Находиться в 2НФ (то есть быть приведенным к состоянию, где все неключевые атрибуты зависят от всего первичного ключа).
2. Каждый неключевой атрибут должен зависеть только от первичного ключа и ни от чего другого.
Непонятно? Рассмотрим на примере.
Представьте, что у нас есть таблица с информацией о заказах:
Эта таблица нарушает 3НФ, потому что есть зависимость product_id -> product_name -> category. То есть название товара и его категория зависят от id продукта, а не напрямую от id заказа.
Чтобы привести таблицу к 3НФ, нужно разбить ее на несколько связанных таблиц:
В итоге структура будет выглядеть так:
Таблица orders:
Таблица products:
Внимательный читатель заметит, что таблица products всё еще не находится в 3НФ😁 . Как думаете, почему и как можно улучшить эту таблицу?
А мы пойдём дальше.
Определить нарушение 3НФ очень просто. Задайте себе несколько вопросов:
– Есть ли в таблице поля, значения которых повторяются (или могут повторяться) для разных строк?
– Можно ли определить значение одного поля через другое неключевое поле?
– При изменении одной записи, нужно ли обновлять другие записи с такими же данными?
Если хотя бы на один вопрос вы ответили "да", скорее всего, ваша таблица не соответствует 3НФ.
Применение 3НФ даёт несколько преимуществ:
– уменьшение избыточности данных: информация хранится только в одном месте, что упрощает обновление и поддержку.
– улучшение целостности данных: меньше шансов, что при обновлении информации возникнут несоответствия.
– гибкость при изменении структуры данных: если нужно добавить новые атрибуты, это не повлияет на таблицу заказов.
Однако стоит помнить, что чрезмерная нормализация может усложнить запросы и снизить производительность, особенно на больших наборах данных. Поэтому в реальных проектах часто используют денормализацию, например, при создании отдельных, часто используемых бизнесом витрин.
#dwh
В прошлый раз мы поговорили про 1 и 2НФ, пора двигаться дальше.
Третья нормальная форма (3НФ) — один из ключевых этапов нормализации данных, который помогает избежать избыточности и аномалий при обновлении информации.
Отношение находится в 3НФ, когда находится во 2НФ и каждый не ключевой атрибут нетранзитивно зависит от первичного ключа.
Как следует из определения, чтобы отношение находилось в 3НФ, оно должно удовлетворять двум условиям:
1. Находиться в 2НФ (то есть быть приведенным к состоянию, где все неключевые атрибуты зависят от всего первичного ключа).
2. Каждый неключевой атрибут должен зависеть только от первичного ключа и ни от чего другого.
Непонятно? Рассмотрим на примере.
Представьте, что у нас есть таблица с информацией о заказах:
| order_id | product_id | product_name | category | qty |
|----------|------------|--------------|----------|-----|
| 1 | 101 | Ноутбук | Техника | 2 |
| 2 | 102 | Смартфон | Техника | 1 |
| 3 | 103 | Футболка | Одежда | 3 |
Эта таблица нарушает 3НФ, потому что есть зависимость product_id -> product_name -> category. То есть название товара и его категория зависят от id продукта, а не напрямую от id заказа.
Чтобы привести таблицу к 3НФ, нужно разбить ее на несколько связанных таблиц:
В итоге структура будет выглядеть так:
Таблица orders:
| order_id | product_id | qty |
|----------|------------|-----|
| 1 | 101 | 2 |
| 2 | 102 | 1 |
| 3 | 103 | 3 |
Таблица products:
| product_id | product_name | category |
|------------|--------------|----------|
| 101 | Ноутбук | Техника |
| 102 | Смартфон | Техника |
| 103 | Футболка | Одежда |
Внимательный читатель заметит, что таблица products всё еще не находится в 3НФ
А мы пойдём дальше.
Определить нарушение 3НФ очень просто. Задайте себе несколько вопросов:
– Есть ли в таблице поля, значения которых повторяются (или могут повторяться) для разных строк?
– Можно ли определить значение одного поля через другое неключевое поле?
– При изменении одной записи, нужно ли обновлять другие записи с такими же данными?
Если хотя бы на один вопрос вы ответили "да", скорее всего, ваша таблица не соответствует 3НФ.
Применение 3НФ даёт несколько преимуществ:
– уменьшение избыточности данных: информация хранится только в одном месте, что упрощает обновление и поддержку.
– улучшение целостности данных: меньше шансов, что при обновлении информации возникнут несоответствия.
– гибкость при изменении структуры данных: если нужно добавить новые атрибуты, это не повлияет на таблицу заказов.
Однако стоит помнить, что чрезмерная нормализация может усложнить запросы и снизить производительность, особенно на больших наборах данных. Поэтому в реальных проектах часто используют денормализацию, например, при создании отдельных, часто используемых бизнесом витрин.
#dwh
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Открыт набор в новый сезон крутой бесплатной менторской программу от Women in Tech и Women in Big Data. Эти женские комьюнити реально помогают девушкам расти и развиваться в IT 🚀
Как для ментора, так и для менти участие в программе открывает отличные возможности для нетворкинга и интересных знакомств, а также это в целом классный опыт.
Присоединяйтесь!
Как для ментора, так и для менти участие в программе открывает отличные возможности для нетворкинга и интересных знакомств, а также это в целом классный опыт.
Присоединяйтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Forwarded from Women in Big Data Russia
Приём заявок в бесплатную программу MENTOR IN TECH 6.0 стартует! Сообщества Women in Tech и Women in Big Data продолжают свою миссию – помогать женщинам строить карьеры в динамичной и конкурентной сфере информационных технологий.
Для участия в MiT мы ждем:
✔️менторов – как мужчин, так и женщин,
✔️менти – женщин.
Станьте менти, если:
• вы мотивированы на карьерный рост, но не знаете, как его добиться;
• вам интересен нетворкинг с единомышленниками и профессионалами в вашей сфере;
• рядом нет профессионала, готового поделиться знаниями и опытом;
• вам пригодится сертификат о прохождении программы менторинга от международных комьюнити WiT и WiBD.
Станьте ментором, если:
• вы хотите получить теоретические и практические знания по обучению сотрудников;
• вы хотите поделиться своим опытом с пользой для женского IT-сообщества;
• вы заинтересованы в продвижении себя как профессионала (в соцсетях WiT и WiBD);
• вам интересен нетворкинг с единомышленниками и профессионалами в вашей сфере;
• вам пригодится сертификат о менторстве от международных комьюнити WiT и WiBD.
Вы можете принимать участие в программе одновременно и как ментор, и как менти по одному из направлений.
Сроки и основные этапы программы:
– с 1 по 15 сентября 2024 – приём заявок (для менти и ментора).
– 30 сентября 2024 – результаты отбора (следите за сообщениями в тг-боте программы).
– с 1 октября 2024 по 1 февраля 2025 – менторинг-сессии, вебинары и воркшопы.
Успейте подать заявку до 15 сентября 2024 с помощью ТГ-бота @MiT_Russia_Bot. Набор происходит на конкурсной основе.
Подробнее о программе мы расскажем 2-го сентября в 19:00 по мск. Присоединяйтесь и задавайте все интересующие вас вопросы. Регистрация по ссылке. Запись будет❗️
Детали программы также доступны на сайте.
Для участия в MiT мы ждем:
✔️менторов – как мужчин, так и женщин,
✔️менти – женщин.
Станьте менти, если:
• вы мотивированы на карьерный рост, но не знаете, как его добиться;
• вам интересен нетворкинг с единомышленниками и профессионалами в вашей сфере;
• рядом нет профессионала, готового поделиться знаниями и опытом;
• вам пригодится сертификат о прохождении программы менторинга от международных комьюнити WiT и WiBD.
Станьте ментором, если:
• вы хотите получить теоретические и практические знания по обучению сотрудников;
• вы хотите поделиться своим опытом с пользой для женского IT-сообщества;
• вы заинтересованы в продвижении себя как профессионала (в соцсетях WiT и WiBD);
• вам интересен нетворкинг с единомышленниками и профессионалами в вашей сфере;
• вам пригодится сертификат о менторстве от международных комьюнити WiT и WiBD.
Вы можете принимать участие в программе одновременно и как ментор, и как менти по одному из направлений.
Сроки и основные этапы программы:
– с 1 по 15 сентября 2024 – приём заявок (для менти и ментора).
– 30 сентября 2024 – результаты отбора (следите за сообщениями в тг-боте программы).
– с 1 октября 2024 по 1 февраля 2025 – менторинг-сессии, вебинары и воркшопы.
Успейте подать заявку до 15 сентября 2024 с помощью ТГ-бота @MiT_Russia_Bot. Набор происходит на конкурсной основе.
Подробнее о программе мы расскажем 2-го сентября в 19:00 по мск. Присоединяйтесь и задавайте все интересующие вас вопросы. Регистрация по ссылке. Запись будет❗️
Детали программы также доступны на сайте.
❤2
Дайджест статей за август 🚀
DWH
Batch vs Streaming: два пути к эффективной обработке данных
Данные: структурированные и не очень
БД
1 и 2 НФ: первые шаги к упорядоченным данным
3НФ: спасаемся от хаоса в данных
Путешествие по миру современных баз данных
SQL
Ранжирующие функции в SQL: как создавать рейтинги и топы
#дайджест
DWH
Batch vs Streaming: два пути к эффективной обработке данных
Данные: структурированные и не очень
БД
1 и 2 НФ: первые шаги к упорядоченным данным
3НФ: спасаемся от хаоса в данных
Путешествие по миру современных баз данных
SQL
Ранжирующие функции в SQL: как создавать рейтинги и топы
#дайджест
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Связи между данными: один-к-одному, один-ко-многим, многие-ко-многим
Захватим ещё немного основ (хотя, кажется, пора заканчивать с очевидным😁 ).
Когда мы работаем с базами данных, то постоянно сталкиваемся с разными типами связей между таблицами. Это база для эффективной организации данных и их анализа, обеспечивающая целостность информации.
Есть три основных типа связей: один к одному, один ко многим и многие ко многим. Давайте разберемся с каждым из них.
Cамый простой тип связи — один к одному (1:1), то есть каждая запись в одной таблице соответствует только одной записи в другой таблице.
Например, есть таблица Сотрудники и таблица Паспортные данные. Каждый сотрудник имеет только один паспорт и каждый паспорт принадлежит только одному сотруднику.
Связь один-ко-многим (1:N) используется, когда одна запись в первой таблице может быть связана с несколькими записями во второй таблице. Например, в одном отделе может работать много сотрудников, но каждый сотрудник может работать только в одном отделе.
Связь многие-ко-многим (M:N) — самый сложный тип связи. Он используется, когда несколько записей из одной таблицы могут быть связаны с несколькими записями из другой таблицы. Обычно для реализации связи M:N используется промежуточная таблица.То есть такая связь разбивается на две связи "один ко многим" через промежуточную таблицу.
Классический пример — студенты и курсы. Один студент может посещать несколько курсов, и на одном курсе учится много студентов.
Таблица students:
Таблица courses:
Таблица students_courses:
Промежуточная таблица students_courses как раз и содержит комбинации ключей из обеих связанных таблиц.
Cтоит отметить, что в хранилищах данных мы иногда отходим от строгой реляционной модели и иногда можем хранить данные в более свободном формате😎 . Но понимание этих базовых типов связей помогает нам правильно организовать данные для эффективного анализа.
#dwh
Захватим ещё немного основ (хотя, кажется, пора заканчивать с очевидным
Когда мы работаем с базами данных, то постоянно сталкиваемся с разными типами связей между таблицами. Это база для эффективной организации данных и их анализа, обеспечивающая целостность информации.
Есть три основных типа связей: один к одному, один ко многим и многие ко многим. Давайте разберемся с каждым из них.
Cамый простой тип связи — один к одному (1:1), то есть каждая запись в одной таблице соответствует только одной записи в другой таблице.
Например, есть таблица Сотрудники и таблица Паспортные данные. Каждый сотрудник имеет только один паспорт и каждый паспорт принадлежит только одному сотруднику.
Связь один-ко-многим (1:N) используется, когда одна запись в первой таблице может быть связана с несколькими записями во второй таблице. Например, в одном отделе может работать много сотрудников, но каждый сотрудник может работать только в одном отделе.
Связь многие-ко-многим (M:N) — самый сложный тип связи. Он используется, когда несколько записей из одной таблицы могут быть связаны с несколькими записями из другой таблицы. Обычно для реализации связи M:N используется промежуточная таблица.То есть такая связь разбивается на две связи "один ко многим" через промежуточную таблицу.
Классический пример — студенты и курсы. Один студент может посещать несколько курсов, и на одном курсе учится много студентов.
Таблица students:
student_id | name
------------------
1 | Анна
2 | Борис
Таблица courses:
course_id | name
----------------------
101 | Математика
102 | Физика
Таблица students_courses:
student_id | course_id
-----------------------
1 | 101
1 | 102
2 | 101
Промежуточная таблица students_courses как раз и содержит комбинации ключей из обеих связанных таблиц.
Cтоит отметить, что в хранилищах данных мы иногда отходим от строгой реляционной модели и иногда можем хранить данные в более свободном формате
#dwh
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🎄1
Snowflake pricing: стоимость хранения и обработки данных
Давно ничего не писала о Snowflake, а ведь сейчас это основная платформа с которой я работаю. Ранее я рассказывала об архитектуре Snowflake, а теперь хочу затронуть не менее важную тему — расчет оплаты за его использование.
Snowflake не требует покупки или аренды физического оборудования. Это облачное решение, где вы платите за потребляемые ресурсы — модель pay-as-you-go. Это одно из его основных преимуществ, которое легко может превратиться в недостаток, если использовать хранилище как попало. Наша задача не просто загружать и обновлять данные, строить витрины, но и делать это максимально экономно. Про особенности оплаты хорошо описано в доках, но всё-таки подчеркну здесь основные моменты.
Snowflake берет плату за хранение данных в зависимости от региона и облачного провайдера (AWS, Azure или GCP). Оплата идет за терабайт в месяц и бывает двух типов:
• On-demand storage — платим только за фактический объем данных.
• Capacity storage — предоплата за объем на год вперёд с возможной экономией до 30%. Однако неиспользованный объем никак не компенсируется.
При этом стоит упомянуть, что в любом из вариантов загружаемые данные автоматически сжимаются, что снижает оплачиваемый объем.
Теперь про обработку данных и тут начинается самое интересное. Вычислительные мощности Snowflake — это виртуальные склады (warehouses). Они обрабатывают запросы и выполняют преобразования данных. Оплата идет в кредитах, и вот как это работает:
• Snowflake предлагает разные размеры warehouses. Чем он больше, тем выше его вычислительная мощность и тем больше кредитов он потребляет в час.
• При этом мы платим только за время, когда warehouse активен. Если он простаивает несколько минут, то автоматически приостанавливается.
• Стоимость кредита зависит от выбранного плана и облачного провайдера.
С передачей данных все просто: внутри одного региона она бесплатна. Но есть нюансы:
• межрегиональная передача между дата-центрами облачных провайдеров оплачивается отдельно и стоит несколько центов за гигабайт;
• выгрузка данных во внешние системы — доп.плата;
• межоблачная передача (например, между AWS и GCP) также оплачивается.
Как оптимизировать расходы?
1. Настроить быстрое «засыпание» warehouses после выполнения пачки задач.
2. Группировать выполнение системных задач.
3. Разделить warehouses для тех. процессов и задач аналитики, правильно подобрав размер под каждый тип задач. Большой warehouse работает быстрее, но и стоит дороже.
4. Использовать автоматическое масштабирование там, где это необходимо — Snowflake может автоматически увеличивать и уменьшать размер warehouse в зависимости от нагрузки.
5. Оптимизировать запросы, ведь неэффективные запросы — прямой путь к лишним расходам.
6. Использовать кэширование результатов — Snowflake кэширует результаты запросов, т.е. если запрос повторяется, результат берется из кэша, что экономит ресурсы.
7. Ну и, конечно, мониторить использование. Snowflake предоставляет подробные отчеты, и хорошо бы регулярно проверять их, чтобы понимать, где можно оптимизировать затраты.
Ценообразование в Snowflake — это целая наука и отдельный проект для анализа и планирования. Выше я описала основы, знание которых поможет немного понять принципы и эффективнее управлять расходами, получая максимум от Snowflake.
#snowflake
Давно ничего не писала о Snowflake, а ведь сейчас это основная платформа с которой я работаю. Ранее я рассказывала об архитектуре Snowflake, а теперь хочу затронуть не менее важную тему — расчет оплаты за его использование.
Snowflake не требует покупки или аренды физического оборудования. Это облачное решение, где вы платите за потребляемые ресурсы — модель pay-as-you-go. Это одно из его основных преимуществ, которое легко может превратиться в недостаток, если использовать хранилище как попало. Наша задача не просто загружать и обновлять данные, строить витрины, но и делать это максимально экономно. Про особенности оплаты хорошо описано в доках, но всё-таки подчеркну здесь основные моменты.
Snowflake берет плату за хранение данных в зависимости от региона и облачного провайдера (AWS, Azure или GCP). Оплата идет за терабайт в месяц и бывает двух типов:
• On-demand storage — платим только за фактический объем данных.
• Capacity storage — предоплата за объем на год вперёд с возможной экономией до 30%. Однако неиспользованный объем никак не компенсируется.
При этом стоит упомянуть, что в любом из вариантов загружаемые данные автоматически сжимаются, что снижает оплачиваемый объем.
Теперь про обработку данных и тут начинается самое интересное. Вычислительные мощности Snowflake — это виртуальные склады (warehouses). Они обрабатывают запросы и выполняют преобразования данных. Оплата идет в кредитах, и вот как это работает:
• Snowflake предлагает разные размеры warehouses. Чем он больше, тем выше его вычислительная мощность и тем больше кредитов он потребляет в час.
• При этом мы платим только за время, когда warehouse активен. Если он простаивает несколько минут, то автоматически приостанавливается.
• Стоимость кредита зависит от выбранного плана и облачного провайдера.
С передачей данных все просто: внутри одного региона она бесплатна. Но есть нюансы:
• межрегиональная передача между дата-центрами облачных провайдеров оплачивается отдельно и стоит несколько центов за гигабайт;
• выгрузка данных во внешние системы — доп.плата;
• межоблачная передача (например, между AWS и GCP) также оплачивается.
Как оптимизировать расходы?
1. Настроить быстрое «засыпание» warehouses после выполнения пачки задач.
2. Группировать выполнение системных задач.
3. Разделить warehouses для тех. процессов и задач аналитики, правильно подобрав размер под каждый тип задач. Большой warehouse работает быстрее, но и стоит дороже.
4. Использовать автоматическое масштабирование там, где это необходимо — Snowflake может автоматически увеличивать и уменьшать размер warehouse в зависимости от нагрузки.
5. Оптимизировать запросы, ведь неэффективные запросы — прямой путь к лишним расходам.
6. Использовать кэширование результатов — Snowflake кэширует результаты запросов, т.е. если запрос повторяется, результат берется из кэша, что экономит ресурсы.
7. Ну и, конечно, мониторить использование. Snowflake предоставляет подробные отчеты, и хорошо бы регулярно проверять их, чтобы понимать, где можно оптимизировать затраты.
Ценообразование в Snowflake — это целая наука и отдельный проект для анализа и планирования. Выше я описала основы, знание которых поможет немного понять принципы и эффективнее управлять расходами, получая максимум от Snowflake.
#snowflake
❤3✍1
Сегодня каналу В мире больших данных 1 год 🥳
Знаете, иногда ловлю себя на мысли: "а в чём смысл, брат?". В черновиках с десяток неотправленых заметок, и каждый раз, когда одна из них всё-таки выходит в свет (после многочисленных переработок), задумываюсь "а надо ли оно?". Ведь интернет и так изобилует информацией на любую тему, и кажется, что всё это было уже до нас.
Когда ты пишешь для начинающих специалистов (и сам при этом ещё далеко не специалист экстра-класса), то сложно выдавать эксклюзивный экспертный контент. Но знаете что? Моя любовь к знаниям и желание ими делиться всё равно берут верх) так что "улыбаемся, машем, и продолжаем пилить контент"💻
Верю, что однажды появится время и силы заняться раскрутой канала по полной. А пока прошу вас, мои подписчики, если считаете заметки полезными — не стесняйтесь ставить лайки и делиться ими. Может, кому-то из ваших знакомых тоже пригодится.
Спасибо каждому подписчку за то, что вы со мной. Вместе мы делаем мир данных чуточку понятнее❤️
Знаете, иногда ловлю себя на мысли: "а в чём смысл, брат?". В черновиках с десяток неотправленых заметок, и каждый раз, когда одна из них всё-таки выходит в свет (после многочисленных переработок), задумываюсь "а надо ли оно?". Ведь интернет и так изобилует информацией на любую тему, и кажется, что всё это было уже до нас.
Когда ты пишешь для начинающих специалистов (и сам при этом ещё далеко не специалист экстра-класса), то сложно выдавать эксклюзивный экспертный контент. Но знаете что? Моя любовь к знаниям и желание ими делиться всё равно берут верх) так что "улыбаемся, машем, и продолжаем пилить контент"
Верю, что однажды появится время и силы заняться раскрутой канала по полной. А пока прошу вас, мои подписчики, если считаете заметки полезными — не стесняйтесь ставить лайки и делиться ими. Может, кому-то из ваших знакомых тоже пригодится.
Спасибо каждому подписчку за то, что вы со мной. Вместе мы делаем мир данных чуточку понятнее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5💯3🎉2
ANY_VALUE: функция для упрощения GROUP BY запросов
Привет! Сегодня расскажу про функцию ANY_VALUE в SQL. Она помогает упростить GROUP BY запросы, особенно когда вы работаете с большими наборами данных.
Если вы работали с агрегатными функциями и группировками GROUP BY, то, вероятно, сталкивались с ограничениями при выборе столбцов.
Представьте, у вас есть не очень нормализированная витрина с заказами (всё также рекомендую смотреть таблички в десктоп версии или развернуть телефон горизонтально🥲 ):
И перед вами стоит задача получить общую сумму заказов для каждого клиента:
Но что если мы захотим добавить в результат customer name (cust_nm)? Получим ошибку, потому что cust_nm не входит в GROUP BY и не используется в агрегатной функции. Вот здесь и приходит на помощь ANY_VALUE:
Этот запрос выполнится без ошибок. ANY_VALUE говорит базе данных: "Возьми любое значение cust_nm для каждой группы cust_id".
Важно понимать, что ANY_VALUE не гарантирует, какое именно значение будет выбрано. Оно может меняться от запуска к запуску. Поэтому используйте эту функцию, только когда вам не важно, какое именно значение будет возвращено, или если вы уверены, что внутри группы значения одинаковы.
ANY_VALUE помогает оптимизировать запросы. В некоторых СУБД она дает понять оптимизатору, что порядок выбора значений не важен, что может привести к более эффективному плану выполнения, чем при использовании min-max на группе.
Однако, не все СУБД поддерживают ANY_VALUE. В PostgreSQL, например, как раз таки придётся использовать min или max:
ANY_VALUE — полезная функция для упрощения агрегатных запросов, когда точное значение не имеет значения. Главное — использовать его осознанно и понимать, когда его применение оправдано.
#sql
Привет! Сегодня расскажу про функцию ANY_VALUE в SQL. Она помогает упростить GROUP BY запросы, особенно когда вы работаете с большими наборами данных.
Если вы работали с агрегатными функциями и группировками GROUP BY, то, вероятно, сталкивались с ограничениями при выборе столбцов.
Представьте, у вас есть не очень нормализированная витрина с заказами (всё также рекомендую смотреть таблички в десктоп версии или развернуть телефон горизонтально
| ord_id | cust_id | cust_nm | product | qty | price |
|--------|---------|---------|------------|-----|-------|
| 101 | 1 | Иван | Ноутбук | 2 | 1500 |
| 102 | 2 | Ольга | Смартфон | 1 | 800 |
| 103 | 1 | Иван | Планшет | 1 | 600 |
| 104 | 3 | Анна | Наушники | 3 | 150 |
| 105 | 2 | Ольга | Умные часы | 2 | 400 |
И перед вами стоит задача получить общую сумму заказов для каждого клиента:
SELECT cust_id, SUM(qty * price) as total_amount
FROM orders
GROUP BY cust_id
Но что если мы захотим добавить в результат customer name (cust_nm)? Получим ошибку, потому что cust_nm не входит в GROUP BY и не используется в агрегатной функции. Вот здесь и приходит на помощь ANY_VALUE:
SELECT
cust_id,
ANY_VALUE(cust_nm) as customer_name,
SUM(qty * price) as total_amount
FROM orders
GROUP BY cust_id
Этот запрос выполнится без ошибок. ANY_VALUE говорит базе данных: "Возьми любое значение cust_nm для каждой группы cust_id".
Важно понимать, что ANY_VALUE не гарантирует, какое именно значение будет выбрано. Оно может меняться от запуска к запуску. Поэтому используйте эту функцию, только когда вам не важно, какое именно значение будет возвращено, или если вы уверены, что внутри группы значения одинаковы.
ANY_VALUE помогает оптимизировать запросы. В некоторых СУБД она дает понять оптимизатору, что порядок выбора значений не важен, что может привести к более эффективному плану выполнения, чем при использовании min-max на группе.
Однако, не все СУБД поддерживают ANY_VALUE. В PostgreSQL, например, как раз таки придётся использовать min или max:
SELECT
cust_id,
MIN(cust_nm) AS customer_name,
SUM(qty * price) AS total_amount
FROM orders
GROUP BY cust_id;
ANY_VALUE — полезная функция для упрощения агрегатных запросов, когда точное значение не имеет значения. Главное — использовать его осознанно и понимать, когда его применение оправдано.
#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4
База — кринж или мастхэв?
Много статей в моём блоге посвящено самым основам, которые кажутся очевидными и «ну уж это то все знают». А мне кажется — знать хорошо, а не забывать и использовать знания ещё лучше.
В системный анализ и аналитику данных часто приходят люди из совершенно разных сфер и многие статьи-курсы делают упор на знания SQL, что, конечно, важно. Но также важно понимать где и как ваши данные лежат изначально, как они связаны друг с другом, как оптимизировать их использование. Ведь порой источник — это настоящий ящик Пандоры.
Связи, первичные ключи, нормализация — это не просто теория, а практический инструмент для системного аналитика DWH. Когда вы глубоко понимаете, как связаны данные о продажах, клиентах и товарах, вы можете точнее перевести требования бизнеса на язык хранилища. Например, для отчета по продажам в разрезе клиентских сегментов вы сразу знаете, какие объекты понадобятся и как их связать.
Нормализация критична при интеграции новых источников. Допустим, нужно загрузить из источника данные о программе лояльности. Вы анализируете структуру исходной таблицы и решаете, нормализовать ли данные при загрузке или оставить как есть. Всё это безусловно зависит от задачи, особенностей хранилища и требований к производительности.
Знание нормализации и денормализации помогает оптимизировать работу хранилища и создавать эффективные витрины. При разработке вы выбираете лучшие источники: нормализованные таблицы ods-слоя или, в каких-то случаях, денормализованные таблицы emart-слоя.
И, опять же, основы помогают эффективно общаться с инженерами и бизнесом. Вы становитесь "переводчиком" между бизнесом и IT, быстро оценивая сложность задач и необходимые изменения в структуре данных.
Поэтому не пренебрегайте базовыми знаниями — они ключ к успешной работе.
#системный_анализ
Много статей в моём блоге посвящено самым основам, которые кажутся очевидными и «ну уж это то все знают». А мне кажется — знать хорошо, а не забывать и использовать знания ещё лучше.
В системный анализ и аналитику данных часто приходят люди из совершенно разных сфер и многие статьи-курсы делают упор на знания SQL, что, конечно, важно. Но также важно понимать где и как ваши данные лежат изначально, как они связаны друг с другом, как оптимизировать их использование. Ведь порой источник — это настоящий ящик Пандоры.
Связи, первичные ключи, нормализация — это не просто теория, а практический инструмент для системного аналитика DWH. Когда вы глубоко понимаете, как связаны данные о продажах, клиентах и товарах, вы можете точнее перевести требования бизнеса на язык хранилища. Например, для отчета по продажам в разрезе клиентских сегментов вы сразу знаете, какие объекты понадобятся и как их связать.
Нормализация критична при интеграции новых источников. Допустим, нужно загрузить из источника данные о программе лояльности. Вы анализируете структуру исходной таблицы и решаете, нормализовать ли данные при загрузке или оставить как есть. Всё это безусловно зависит от задачи, особенностей хранилища и требований к производительности.
Знание нормализации и денормализации помогает оптимизировать работу хранилища и создавать эффективные витрины. При разработке вы выбираете лучшие источники: нормализованные таблицы ods-слоя или, в каких-то случаях, денормализованные таблицы emart-слоя.
И, опять же, основы помогают эффективно общаться с инженерами и бизнесом. Вы становитесь "переводчиком" между бизнесом и IT, быстро оценивая сложность задач и необходимые изменения в структуре данных.
Поэтому не пренебрегайте базовыми знаниями — они ключ к успешной работе.
#системный_анализ
👍5✍3
TABLE_DML_HISTORY: окно в мир изменений ваших данных
Вьюха TABLE_DML_HISTORY в Snowflake — инструмент, который помогает отслеживать и анализировать DML-операции (Data Manipulation Language) в таблицах. По сути он выводит агрегированную информацию о влиянии DML-операций на ваши данные.
Вот что там можно узнать:
🔵 какие таблицы изменялись
🔵 временные интервалы, в которые происходили изменения
🔵 количество добавленных, удаленных и обновленных строк
Предположим, вы хотите узнать, какие изменения были внесены в таблицу SALES за последние 24 часа. Для этого можно выполнить следующий запрос:
Если нужно проанализировать изменения во всех таблицах определенной схемы за месяц, можно использовать такой запрос:
Но не бывает крутых функций без нюансов и ограничений. TABLE_DML_HISTORY:
🔵 содержит информацию по всем DML-операциям, выполненным за последние 365 дней;
🔵 задержка обновления данных может составлять до 6 часов;
🔵 не включает DML-операции на гибридных таблицах
🔵 доступ к этому представлению зависит от привилегий пользователя, обычно требуется роль ACCOUNTADMIN или соответствующие права на чтение из схемы ACCOUNT_USAGE.
Советы по использованию:
🔵 мониторинг активности: регулярное отслеживание DML-операций помогает выявлять аномальные изменения и потенциальные проблемы с данными.
🔵 аудит изменений: можно проводить аудит изменений в важных таблицах для обеспечения соответствия внутренним политикам и внешним требованиям.
🔵 оптимизация производительности: анализ частоты и объема DML-операций может помочь в оптимизации запросов и пайплайнов.
TABLE_DML_HISTORY — хороший инструмент для мониторинга и аудита данных в Snowflake. Используйте его, чтобы лучше понимать, что происходит с вашими данными и вовремя вносить изменения в неоптимальные процессы.
Более подробную информацию вы всегда можете найти в официальной документации Snowflake.
#dwh #snowflake
Вьюха TABLE_DML_HISTORY в Snowflake — инструмент, который помогает отслеживать и анализировать DML-операции (Data Manipulation Language) в таблицах. По сути он выводит агрегированную информацию о влиянии DML-операций на ваши данные.
Вот что там можно узнать:
Предположим, вы хотите узнать, какие изменения были внесены в таблицу SALES за последние 24 часа. Для этого можно выполнить следующий запрос:
SELECT
START_TIME,
END_TIME,
ROWS_ADDED,
ROWS_UPDATED,
ROWS_REMOVED
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_DML_HISTORY
WHERE TABLE_NAME = 'SALES'
AND START_TIME >= DATEADD('day', -1, CURRENT_TIMESTAMP())
ORDER BY START_TIME DESC;
Если нужно проанализировать изменения во всех таблицах определенной схемы за месяц, можно использовать такой запрос:
SELECT
TABLE_NAME,
SUM(ROWS_ADDED) AS TOTAL_ROWS_ADDED,
SUM(ROWS_UPDATED) AS TOTAL_ROWS_UPDATED,
SUM(ROWS_REMOVED) AS TOTAL_ROWS_REMOVED
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_DML_HISTORY
WHERE SCHEMA_NAME = 'SANDBOX'
AND START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP())
GROUP BY TABLE_NAME;
Но не бывает крутых функций без нюансов и ограничений. TABLE_DML_HISTORY:
Советы по использованию:
TABLE_DML_HISTORY — хороший инструмент для мониторинга и аудита данных в Snowflake. Используйте его, чтобы лучше понимать, что происходит с вашими данными и вовремя вносить изменения в неоптимальные процессы.
Более подробную информацию вы всегда можете найти в официальной документации Snowflake.
#dwh #snowflake
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет, у меня отличные новости! Совсем скоро я выступаю на IT-конференции UIC Dev в Ижевске.
UIC Dev — конференция для всех, кто в теме IT: разработчиков, аналитиков, тестировщиков, дизайнеров, SEO-шников, копирайтеров и маркетологов.
Я и Head of DWH Emex Катя Колпакова выступим с докладом "Как мы построили DWH для международного холдинга командой из 6 человек".
Мы расскажем о нашем пути создания хранилища данных для Emex. Поделимся, почему этот проект был сложным из-за большого количества бизнес-моделей, кучи легаси и запутанных связей. Расскажем, как мы выбирали базу данных, какие методологии и технологии использовали. А также раскроем некоторые фишки нашего DWH.
Что ещё ждёт вас на конференции:
🔘 6 направлений: от аналитики до разработки (программа тут)
🔘 Больше 70 докладов про инструменты, кейсы, "боли" IT-сообщества, AI и будущее
🔘 Обсуждение трендов в IT
🔘 Общение с единомышленниками и обмен опытом
🔘 Интерактивы и призы
Вечером первого дня — афтепати с живой музыкой (“Стихи на окнах подъезда №8”) и дискотекой.
🎁 Кстати, для вас скидка 30% по промокоду
Не пропустите — будет интересно! Увидимся на UIC Dev и пообщаемся лично!😉
UIC Dev — конференция для всех, кто в теме IT: разработчиков, аналитиков, тестировщиков, дизайнеров, SEO-шников, копирайтеров и маркетологов.
Я и Head of DWH Emex Катя Колпакова выступим с докладом "Как мы построили DWH для международного холдинга командой из 6 человек".
Мы расскажем о нашем пути создания хранилища данных для Emex. Поделимся, почему этот проект был сложным из-за большого количества бизнес-моделей, кучи легаси и запутанных связей. Расскажем, как мы выбирали базу данных, какие методологии и технологии использовали. А также раскроем некоторые фишки нашего DWH.
Что ещё ждёт вас на конференции:
Вечером первого дня — афтепати с живой музыкой (“Стихи на окнах подъезда №8”) и дискотекой.
🎁 Кстати, для вас скидка 30% по промокоду
IVANOVA
при покупке билетов на сайте uic.dev/#tickets.Не пропустите — будет интересно! Увидимся на UIC Dev и пообщаемся лично!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2
UNION и UNION ALL. Так ли всё просто?
Маленькая заметка-напоминалка.
Операторы UNION и UNION ALL в SQL отвечают за объединение результатов нескольких запросов. При этом просто UNION выводит только уникальные строки в запросах, то с ALL выведет абсолютно все строки, включая возможные дубли.
Как операторы объединения работают с NULL?
UNION — объединит похожие строки, содержащие NULL в 1 (считая, что это дубли), а UNION ALL оставит все строки.
Ещё несколько особенностей:
1. Набор полей у всех объединяемых запросов должен быть одинаков.
2. Важно! При использовании UNION снижается производительность, так как приходится сканировать результат на наличие дублей. В случае, если в результатах объединения предсказуемо нет дублирующихся полей, предпочтительнее использовать UNION ALL.
#sql #null
Маленькая заметка-напоминалка.
Операторы UNION и UNION ALL в SQL отвечают за объединение результатов нескольких запросов. При этом просто UNION выводит только уникальные строки в запросах, то с ALL выведет абсолютно все строки, включая возможные дубли.
Как операторы объединения работают с NULL?
UNION — объединит похожие строки, содержащие NULL в 1 (считая, что это дубли), а UNION ALL оставит все строки.
Ещё несколько особенностей:
1. Набор полей у всех объединяемых запросов должен быть одинаков.
2. Важно! При использовании UNION снижается производительность, так как приходится сканировать результат на наличие дублей. В случае, если в результатах объединения предсказуемо нет дублирующихся полей, предпочтительнее использовать UNION ALL.
#sql #null
👍5
Денормализация данных: когда и зачем нарушать правила
Денормализация — это намеренное введение избыточности данных в таблице. Звучит как ересь, не так ли? Мы же так долго их номрализовывали! Однако, в мире больших данных и высоких нагрузок этот подход имеет место быть.
Часто нормализацию сознательно нарушают для повышения производительности системы, так как большое количество JOIN приводит к медленному выполнению запросов. Таким образом денормализация становится необходимой для ускорения доступа к данным и оптимизации запросов. Она ускоряет чтение данных, что особенно важно для построения дашбордов.
Когда применять денормализацию?
🔵 Есть часто выполняемые сложные запросы с множеством соединений — денормализация может значительно ускорить их выполнение за счёт хранения предварительно агрегированных данных в одной таблице.
🔵 Для систем бизнес-аналитики (BI) и хранилищ данных денормализация — обычная практика. Она позволяет быстрее выполнять сложные расчеты и агрегации.
🔵 В распределенных базах данных JOIN-ы между таблицами, хранящимися на разных узлах, могут быть очень дорогостоящими. Денормализация помогает избежать этих сложных операций.
Давайте рассмотрим пример. Представим, у нас есть интернет-магазин с миллионами заказов. В нормализованной схеме информация о заказе, клиенте и товарах хранится в разных таблицах:
Для получения полной информации о заказе нам приходится объединять все эти таблицы:
При высокой нагрузке это может стать узким местом. В денормализованной версии мы можем хранить все нужные нам столбцы и расчёты (н-р, order_id, customer_name, customer_email, product_name, quantity, price, total_price, order_date). Когда вся информация доступна в одной таблице, это значительно ускоряет запросы на чтение:
Важно понимать и помнить, что у этого подхода есть и свои минусы:
🔵 Избыточность данных: мы храним одну и ту же информацию в нескольких местах, что увеличивает объем хранилища.
🔵 Сложность обновления: при изменении данных (например, имени клиента) нужно обновлять информацию во всех связанных записях.
🔵 Риск несогласованности: если обновление происходит не атомарно, может возникнуть ситуация, когда данные в разных местах не соответствуют друг другу.
Чтобы минимизировать эти риски, можно использовать различные техники. Например, материализованные представления позволяют создавать денормализованные таблицы, которые автоматически обновляются при изменении исходных данных.
В конечном счете, выбор между нормализацией и денормализацией зависит от конкретных требований вашей бизнес-задачи. Главное — понимать последствия своего выбора и быть готовым вносить изменения по мере роста и изменения системы.
А вы сталкивались с необходимостью денормализации в своих проектах? Какие подходы использовали для поддержания согласованности данных?
#dwh
Денормализация — это намеренное введение избыточности данных в таблице. Звучит как ересь, не так ли? Мы же так долго их номрализовывали! Однако, в мире больших данных и высоких нагрузок этот подход имеет место быть.
Часто нормализацию сознательно нарушают для повышения производительности системы, так как большое количество JOIN приводит к медленному выполнению запросов. Таким образом денормализация становится необходимой для ускорения доступа к данным и оптимизации запросов. Она ускоряет чтение данных, что особенно важно для построения дашбордов.
Когда применять денормализацию?
Давайте рассмотрим пример. Представим, у нас есть интернет-магазин с миллионами заказов. В нормализованной схеме информация о заказе, клиенте и товарах хранится в разных таблицах:
orders:
| order_id | customer_id | order_date |
|----------|-------------|------------|
| 1 | 101 | 2024-09-01 |
customers:
| customer_id | name | email |
|-------------|-------|----------------|
| 101 | Алиса | [email protected] |
order_items:
| order_id | product_id | quantity |
|----------|------------|----------|
| 1 | 201 | 2 |
products:
| product_id | name | price |
|------------|----------|-------|
| 201 | Ноутбук | 50000 |
Для получения полной информации о заказе нам приходится объединять все эти таблицы:
SELECT
o.order_id,
c.name AS customer_name,
c.email AS customer_email,
p.name AS product_name,
oi.quantity,
p.price,
oi.quantity * p.price AS total_price,
o.order_date
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE c.name = 'Алиса';
При высокой нагрузке это может стать узким местом. В денормализованной версии мы можем хранить все нужные нам столбцы и расчёты (н-р, order_id, customer_name, customer_email, product_name, quantity, price, total_price, order_date). Когда вся информация доступна в одной таблице, это значительно ускоряет запросы на чтение:
SELECT
order_id,
customer_name,
customer_email,
product_name,
quantity,
price,
total_price,
order_date
FROM orders o
WHERE customer_name = 'Алиса';
Важно понимать и помнить, что у этого подхода есть и свои минусы:
Чтобы минимизировать эти риски, можно использовать различные техники. Например, материализованные представления позволяют создавать денормализованные таблицы, которые автоматически обновляются при изменении исходных данных.
В конечном счете, выбор между нормализацией и денормализацией зависит от конкретных требований вашей бизнес-задачи. Главное — понимать последствия своего выбора и быть готовым вносить изменения по мере роста и изменения системы.
А вы сталкивались с необходимостью денормализации в своих проектах? Какие подходы использовали для поддержания согласованности данных?
#dwh
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Дайджест статей за сентябрь 🚀
DWH
Денормализация данных: когда и зачем нарушать правила
БД
Связи между данными: один-к-одному, один-ко-многим, многие-ко-многим
Snowflake
Snowflake pricing: стоимость хранения и обработки данных
TABLE_DML_HISTORY: окно в мир изменений ваших данных
SQL
ANY_VALUE: функция для упрощения GROUP BY запросов
UNION и UNION ALL. Так ли всё просто?
Размышления
База — кринж или мастхэв?
#дайджест
DWH
Денормализация данных: когда и зачем нарушать правила
БД
Связи между данными: один-к-одному, один-ко-многим, многие-ко-многим
Snowflake
Snowflake pricing: стоимость хранения и обработки данных
TABLE_DML_HISTORY: окно в мир изменений ваших данных
SQL
ANY_VALUE: функция для упрощения GROUP BY запросов
UNION и UNION ALL. Так ли всё просто?
Размышления
База — кринж или мастхэв?
#дайджест
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
В мире больших данных
Денормализация данных: когда и зачем нарушать правила
Денормализация — это намеренное введение избыточности данных в таблице. Звучит как ересь, не так ли? Мы же так долго их номрализовывали! Однако, в мире больших данных и высоких нагрузок этот подход имеет…
Денормализация — это намеренное введение избыточности данных в таблице. Звучит как ересь, не так ли? Мы же так долго их номрализовывали! Однако, в мире больших данных и высоких нагрузок этот подход имеет…
🔥1
QUALIFY: фильтруем результаты оконных функций
QUALIFY — SQL-конструкция, которая позволяет отфильтровать результаты после применения оконных функций😍
Она работает аналогично WHERE, но с той разницей, что QUALIFY применяется после оконных функций, а WHERE — до них.
Напомню порядок выполнения запроса:
1. From
2. Where
3. Group by
4. Having
5. Window
6. QUALIFY
7. Distinct
8. Order by
9. Limit
Представим, что у нас есть таблица продаж, и мы хотим выбрать топ-5 продаж по каждой категории товаров. С помощью QUALIFY это можно сделать просто и эффективно:
В этом запросе сначала нумеруем продажи в каждой категории по убыванию суммы продаж с помощью ROW_NUMBER(). Затем с помощью QUALIFY оставляем только первые пять записей в каждой категории. Легко и понятно.
Почему нельзя использовать WHERE вместо QUALIFY? Потому что WHERE фильтрует данные до выполнения оконных функций, а нам нужно отфильтровать данные после. Если попробовать использовать WHERE rn <= 5, SQL не поймёт, что такое rn, потому что на этапе выполнения WHERE эта колонка ещё не создана.
Конечно, можно использовать QUALIFY и с другими оконными функциями, например, RANK():
Этот запрос выберет сотрудников с наивысшей зарплатой в каждом отделе.
Стоит отметить, что QUALIFY поддерживается не во всех СУБД. Например, в Snowflake и Teradata эта функция есть, а в PostgreSQL или MySQL её нет. В таких случаях приходится использовать подзапросы или CTE (Common Table Expressions).
Например так:
Согласитесь, что использование QUALIFY делает код более кратким и читаемым. Используйте его, когда это возможно😎
#sql
QUALIFY — SQL-конструкция, которая позволяет отфильтровать результаты после применения оконных функций
Она работает аналогично WHERE, но с той разницей, что QUALIFY применяется после оконных функций, а WHERE — до них.
Напомню порядок выполнения запроса:
1. From
2. Where
3. Group by
4. Having
5. Window
6. QUALIFY
7. Distinct
8. Order by
9. Limit
Представим, что у нас есть таблица продаж, и мы хотим выбрать топ-5 продаж по каждой категории товаров. С помощью QUALIFY это можно сделать просто и эффективно:
SELECT
category,
product,
sales_amount,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY sales_amount DESC) AS rn
FROM sales
QUALIFY rn <= 5;
В этом запросе сначала нумеруем продажи в каждой категории по убыванию суммы продаж с помощью ROW_NUMBER(). Затем с помощью QUALIFY оставляем только первые пять записей в каждой категории. Легко и понятно.
Почему нельзя использовать WHERE вместо QUALIFY? Потому что WHERE фильтрует данные до выполнения оконных функций, а нам нужно отфильтровать данные после. Если попробовать использовать WHERE rn <= 5, SQL не поймёт, что такое rn, потому что на этапе выполнения WHERE эта колонка ещё не создана.
Конечно, можно использовать QUALIFY и с другими оконными функциями, например, RANK():
SELECT
employee_id,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC)
AS salary_rank
FROM employees
QUALIFY salary_rank = 1;
Этот запрос выберет сотрудников с наивысшей зарплатой в каждом отделе.
Стоит отметить, что QUALIFY поддерживается не во всех СУБД. Например, в Snowflake и Teradata эта функция есть, а в PostgreSQL или MySQL её нет. В таких случаях приходится использовать подзапросы или CTE (Common Table Expressions).
Например так:
WITH ranked_sales AS (
SELECT
category,
product,
sales_amount,
RANK() OVER (PARTITION BY category ORDER BY sales_amount DESC) AS rn
FROM sales
)
SELECT *
FROM ranked_sales
WHERE rn <= 5;
Согласитесь, что использование QUALIFY делает код более кратким и читаемым. Используйте его, когда это возможно
#sql
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥4
На прошлой неделе я выступала на конференции UIC Dev с докладом "Автоматизируй это: как мы построили DWH для международного холдинга командой из 6 человек". Это был мой первый опыт участия в качестве спикера и, кажется, я справилась неплохо. Хочется зафиксировать для себя этот момент.
Мои инсайты:
🟠 быть спикером и просто участником конференции — две параллельные реальности с совершенно разными мироощущениям в процессе (даже когда слушаешь чужие доклады), круто быть внутри тусовки 😍
🟠 рассказывать о том, что любишь не страшно;
🟠 твои слушатели — такие же люди, как и ты. Нормально чего-то не знать или быть неуверенным, хуже — ничего не делать;
🟠 хорошая шутка в нужный момент — половина успеха;
🟠 вторая половина — умение адаптировать свой рассказ под аудиторию и быть гибким (наше выступление было сильно лучше, чем все прогоны до этого).
Несмотря на то, что конференция была "всё обо всём" и в какой-то момент мы стали волноваться, что тема DWH не вызовет большого интересна, нас приняли отлично и вопросы задавали хорошие и к месту. Это ценно! Спасибо🙂
С улыбкой обнимаю себя вчерашнюю; ту, что краснела, ведя онлайн-митап для коллег без камер. Прошло полтора года, а как будто целая вечность.
Спасибо UIC Dev. Отличный опыт, было интересно🐱
#life
Мои инсайты:
Несмотря на то, что конференция была "всё обо всём" и в какой-то момент мы стали волноваться, что тема DWH не вызовет большого интересна, нас приняли отлично и вопросы задавали хорошие и к месту. Это ценно! Спасибо
С улыбкой обнимаю себя вчерашнюю; ту, что краснела, ведя онлайн-митап для коллег без камер. Прошло полтора года, а как будто целая вечность.
Спасибо UIC Dev. Отличный опыт, было интересно
#life
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤4
Загрузка данных в хранилище: полная, инкрементальная и частичная перезагрузка
Что самое главное в DWH? Конечно же, данные, которые как-то должны попасть в хранилище. Чаще мы используем современные методы загрузки, но на ранних этапах или из-за тех. ограничений, или при исследованиях, мы всё также прибегаем к классическим методам.
Есть три основных подхода: полная загрузка, инкрементальная и частичная перезагрузка. Системным аналитикам важно понимать когда какой подход лучше использовать.
При полной загрузке мы каждый раз заново забираем все данные из источника, полностью заменяя существующие данные в хранилище. Почему "полностью" курсивом? Иногда нам нужно отслеживать удалённые строки, тогда мы не просто транкейтим, а размечаем отсутствующие строки флагом DELETED.
Полная загрузка — самый простой метод со своими особенностями:
➕ простота реализации
➕ 100% актуальность данных
➖ высокая нагрузка при больших объемах данных
➖ время выполнения
➖ неэффективное использование ресурсов при небольших изменениях.
Этот метод идеален для небольших таблиц или когда нужна полная уверенность в актуальности данных. Также он хорошо подходит для справочников и других статичных данных, которые обновляются очень редко (обратите внимание, что редко определяется требованиями конкретного бизнеса).
При инкрементальном методе мы добавляем только новые или измененные данные с момента последней загрузки. Это существенно экономит время и ресурсы. Особенности:
➕ быстрее
➕ меньше нагрузка на источник и хранилище
➕ эффективное использование ресурсов
➖ сложность реализации и отслеживания изменений
➖ риск пропустить изменения
➖ нужно хранить метаданные о загрузках.
Для больших таблиц с частыми апдейтами — то, что надо. Важно❗️ если нужно отслеживать изменения, у таблиц должно быть поле, содержащее дату и время обновления строки. Убедитесь, что вы можете доверять ему. Комментарии к полям могут врать! В моей практике были случаи, когда дата содержала инфу об изменении только нескольких полей из таблицы, что не было нигде явно указано 🥲 (да, иногда нужно покапаться в коде источника)
Также важно помнить, что если в таблице удалили какую-то строку, то вы никогда об этом не узнаете, ведь вы забираете изменения только по существующим строкам.
Если мы говорим только про забор новых изменений, нам нужно инкрементное поле или поле с датой добавления строки (желательно заполняемое getdate), по которому мы будем забирать только новые строки. Метод отлично подходит для логов.
Частичная перезагрузка — гибрид предыдущих способов. Здесь мы перезагружаем только часть данных, обычно за какой-то конкретный период.
➕ баланс актуальности и эффективности
➕ обновление за определенный период без полной перезагрузки
➕ удобно для данных с "окном актуальности"
➖ сложно определить оптимальный период
➖ риск дублей при неправильной реализации
➖ нужна дополнительная логика для определения границ загрузки
Частичную перезагрузку часто применяют для данных с "окном актуальности", например, когда нужно обновить данные за последний месяц или квартал. Когда точно известно, что "более старые" данные неизменны. Здесь та же история, про которую я писала выше, у вас должно быть поле с датой, которому вы точно можете доверять.
Подытожу, выбор метода загрузки зависит от многих факторов: объема данных, частоты обновлений, требований к актуальности и доступных ресурсов. Но даже если на первый взгляд кажется, что выбрать нужный метод просто, в реальной жизни часто приходится идти на компромиссы или комбинировать подходы. Например, объект с миллионами строк без даты обновления можно днем грузить инкрементально, а раз в неделю обновлять целиком. Так себе история и, конечно, лучше использовать иные методы загрузки, но ситуации бывают разными. Будьте к ним готовы.
Благодаря тому, что источники не идеальны, работа системного аналитика всегда где-то на грани творчества и здравого смысла😇
#dwh
Что самое главное в DWH? Конечно же, данные, которые как-то должны попасть в хранилище. Чаще мы используем современные методы загрузки, но на ранних этапах или из-за тех. ограничений, или при исследованиях, мы всё также прибегаем к классическим методам.
Есть три основных подхода: полная загрузка, инкрементальная и частичная перезагрузка. Системным аналитикам важно понимать когда какой подход лучше использовать.
При полной загрузке мы каждый раз заново забираем все данные из источника, полностью заменяя существующие данные в хранилище. Почему "полностью" курсивом? Иногда нам нужно отслеживать удалённые строки, тогда мы не просто транкейтим, а размечаем отсутствующие строки флагом DELETED.
Полная загрузка — самый простой метод со своими особенностями:
Этот метод идеален для небольших таблиц или когда нужна полная уверенность в актуальности данных. Также он хорошо подходит для справочников и других статичных данных, которые обновляются очень редко (обратите внимание, что редко определяется требованиями конкретного бизнеса).
При инкрементальном методе мы добавляем только новые или измененные данные с момента последней загрузки. Это существенно экономит время и ресурсы. Особенности:
Для больших таблиц с частыми апдейтами — то, что надо. Важно
Также важно помнить, что если в таблице удалили какую-то строку, то вы никогда об этом не узнаете, ведь вы забираете изменения только по существующим строкам.
Если мы говорим только про забор новых изменений, нам нужно инкрементное поле или поле с датой добавления строки (желательно заполняемое getdate), по которому мы будем забирать только новые строки. Метод отлично подходит для логов.
Частичная перезагрузка — гибрид предыдущих способов. Здесь мы перезагружаем только часть данных, обычно за какой-то конкретный период.
Частичную перезагрузку часто применяют для данных с "окном актуальности", например, когда нужно обновить данные за последний месяц или квартал. Когда точно известно, что "более старые" данные неизменны. Здесь та же история, про которую я писала выше, у вас должно быть поле с датой, которому вы точно можете доверять.
Подытожу, выбор метода загрузки зависит от многих факторов: объема данных, частоты обновлений, требований к актуальности и доступных ресурсов. Но даже если на первый взгляд кажется, что выбрать нужный метод просто, в реальной жизни часто приходится идти на компромиссы или комбинировать подходы. Например, объект с миллионами строк без даты обновления можно днем грузить инкрементально, а раз в неделю обновлять целиком. Так себе история и, конечно, лучше использовать иные методы загрузки, но ситуации бывают разными. Будьте к ним готовы.
Благодаря тому, что источники не идеальны, работа системного аналитика всегда где-то на грани творчества и здравого смысла
#dwh
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
Всегда хочется быть сильной, ведь кажется, что сила и развитие — это обязательные условия нашего времени. Но не всегда это можется, а скорее всего и не нужно. Иногда полезно отпустить стремление быть успешной, позволив себе принять слабость как временную передышку.
Осень не умеет удивлять и вновь она принесла с собой череду болезней, словно напоминая, что каждому из нас нужен отдых.
Поэтому на канале небольшая пауза — чтобы восстановиться и вернуться с новыми силами и вдохновением.
Будьте здоровы🍀
#life
Осень не умеет удивлять и вновь она принесла с собой череду болезней, словно напоминая, что каждому из нас нужен отдых.
Поэтому на канале небольшая пауза — чтобы восстановиться и вернуться с новыми силами и вдохновением.
Будьте здоровы
#life
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍1🕊1