Расширенная и дополненная с учетом современных требований и техник, эта книга представляет собой наиболее полное руководство по языку DAX, применяемому в области бизнес-аналитики, моделирования данных и анализа. Эксперты Microsoft BI Марко Руссо и Альберто Феррари излагают как основы, так и отдельные нюансы работы с DAX: от простых табличных функций до продвинутых техник программирования и оптимизации моделей. Вы узнаете, что происходит под капотом движка DAX при запуске выражений; полученные знания пригодятся при написании быстрого и надежного кода.
В книге используются примеры, которые можно запустить в бесплатной версии Power BI Desktop и разобраться во всех тонкостях синтаксиса создания переменных (VAR) в Power BI, Excel или Analysis Services.
Издание предназначено для опытных пользователей и профессионалов в сфере бизнес-аналитики, использующих в своей работе DAX и аналитические инструменты от Microsoft.
Author(s): Марко Руссо; Альберто Феррари
Publisher: ДМК Пресс
Year: 2020
Language: Russian
Pages: 776
City: Москва
Рецензия
Об авторах
От команды разработчиков
Благодарности
От издательства
Предисловие ко второму изданию
Предисловие к первому изданию
Глава 1. Что такое DAX?
Введение в модель данных
Введение в направление связи
DAX для пользователей Excel
Ячейки против таблиц
Excel и DAX: два функциональных языка
Итерационные функции в DAX
DAX требует изучения теории
DAX для разработчиков SQL
Работа со связями
DAX как функциональный язык
DAX как язык программирования и язык запросов
Подзапросы и условия в DAX и SQL
DAX для разработчиков MDX
Многомерность против табличности
DAX как язык программирования и язык запросов
Иерархии
Вычисления на конечном уровне
DAX для пользователей Power BI
Глава 2. Знакомство с DAX
Введение в вычисления DAX
Типы данных DAX
Операторы DAX
Конструкторы таблиц
Условные операторы
Введение в вычисляемые столбцы и меры
Вычисляемые столбцы
Меры
Введение в переменные
Обработка ошибок в выражениях DAX
Ошибки преобразования
Ошибки арифметических операций
Перехват ошибок
Генерирование ошибок
Форматирование кода на DAX
Введение в агрегаторы и итераторы
Использование распространенных функций DAX
Функции агрегирования
Логические функции
Информационные функции
Математические функции
Тригонометрические функции
Текстовые функции
Функции преобразования
Функции для работы с датой и временем
Функции отношений
Заключение
Глава 3. Использование основных табличных функций
Введение в табличные функции
Введение в синтаксис EVALUATE
Введение в функцию FILTER
Введение в функции ALL и ALLEXCEPT
Введение в функции VALUES, DISTINCT и пустые строки
Использование таблиц в качестве скалярных значений
Введение в функцию ALLSELECTED
Заключение
Глава 4. Введение в контексты вычисления
Введение в контексты вычисления
Знакомство с контекстом фильтра
Знакомство с контекстом строки
Тест на понимание контекстов вычисления
Использование функции SUM в вычисляемых столбцах
Использование ссылок на столбцы в мерах
Использование контекста строки с итераторами
Вложенные контексты строки в разных таблицах
Вложенные контексты строки в одной таблице
Использование функции EARLIER
Функции FILTER, ALL и взаимодействие между контекстами
Работа с несколькими таблицами
Контексты строки и связи
Контекст фильтра и связи
Использование функций DISTINCT и SUMMARIZE в контекстах фильтра
Заключение
Глава 5. Функции CALCULATE и CALCULATETABLE
Введение в функции CALCULATE и CALCULATETABLE
Создание контекста фильтра
Знакомство с функцией CALCULATE
Использование функции CALCULATE для расчета процентов
Введение в функцию KEEPFILTERS
Фильтрация по одному столбцу
Фильтрация по сложным условиям
Порядок вычислений в функции CALCULATE
Преобразование контекста
Повторение темы контекста строки и контекста фильтра
Введение в преобразование контекста
Преобразование контекста в вычисляемых столбцах
Преобразование контекста в мерах
Циклические зависимости
Модификаторы функции CALCULATE
Модификатор USERELATIONSHIP
Модификатор CROSSFILTER
Модификатор KEEPFILTERS
Использование модификатора ALL в функции CALCULATE
Использование ALL и ALLSELECTED без параметров
Правила вычисления в функции CALCULATE
Глава 6. Переменные
Введение в синтаксис переменных VAR
Переменные – это константы
Области видимости переменных
Использование табличных переменных
Отложенное вычисление переменных
Распространенные шаблоны использования переменных
Заключение
Глава 7. Работа с итераторами и функцией CALCULATE
Использование итерационных функций
Кратность итератора
Использование преобразования контекста в итераторах
Использование функции CONCATENATEX
Итераторы, возвращающие таблицы
Решение распространенных сценариев при помощи итераторов
Расчет среднего и скользящего среднего
Использование функции RANKX
Изменение гранулярности вычисления
Заключение
Глава 8. Логика операций со временем
Введение в логику операций со временем
Автоматические дата и время в Power BI
Автоматические столбцы с датами в Power Pivot для Excel
Шаблон таблицы дат в Power Pivot для Excel
Создание таблицы дат
Использование функций CALENDAR и CALENDARAUTO
Работа со множественными датами
Поддержка множественных связей с таблицей дат
Поддержка нескольких таблиц дат
Знакомство с базовыми вычислениями в работе со временем
Пометка календарей как таблиц дат
Знакомство с базовыми функциями логики операций со временем
Нарастающие итоги с начала года, квартала, месяца
Сравнение временных интервалов
Сочетание функций логики операций со временем
Расчет разницы по сравнению с предыдущим периодом
Расчет скользящей годовой суммы
Выбор порядка вложенности функций логики операций со временем
Знакомство с полуаддитивными вычислениями
Использование функций LASTDATE и LASTNONBLANK
Работа с остатками на начало и конец периода
Усовершенствованные методы работы с датой и временем
Вычисления нарастающим итогом
Функция DATEADD
Функции FIRSTDATE, LASTDATE, FIRSTNONBLANK и LASTNONBLANK
Использование детализации с функциями логики операций со временем
Работа с пользовательскими календарями
Работа с неделями
Пользовательские вычисления нарастающим итогом
Заключение
Глава 9. Группы вычислений
Знакомство с группами вычислений
Создание групп вычислений
Знакомство с группами вычислений
Применение элемента вычисления
Очередность применения групп вычислений
Включение и исключение мер из элементов вычисления
Косвенная рекурсия
Два основных правила
Заключение
Глава 10. Работа с контекстом фильтра
Использование функций HASONEVALUE и SELECTEDVALUE
Использование функций ISFILTERED и ISCROSSFILTERED
Понимание разницы между функциями VALUES и FILTERS
Понимание разницы между ALLEXCEPT и ALL/VALUES
Использование функции ALL для предотвращения преобразования контекста
Использование функции ISEMPTY
Привязка данных и функция TREATAS
Фильтры произвольной формы
Заключение
Глава 11. Работа с иерархиями
Вычисление процентов внутри иерархии
Работа с иерархиями типа родитель/потомок
Заключение
Глава 12. Работа с таблицами
Функция CALCULATETABLE
Манипулирование таблицами
Функция ADDCOLUMNS
Функция SUMMARIZE
Функция CROSSJOIN
Функция UNION
Функция INTERSECT
Функция EXCEPT
Использование таблиц в качестве фильтров
Применение условных конструкций OR
Ограничение расчетов постоянными покупателями с первого года
Вычисление новых покупателей
Повторное использование табличных выражений при помощи функции DETAILROWS
Создание вычисляемых таблиц
Функция SELECTCOLUMNS
Создание статических таблиц при помощи функции ROW
Создание статических таблиц при помощи функции DATATABLE
Функция GENERATESERIES
Заключение
Глава 13. Создание запросов
Знакомство с DAX Studio
Инструкция EVALUATE
Введение в синтаксис EVALUATE
Использование VAR внутри DEFINE
Использование MEASURE внутри DEFINE
Реализация распространенных шаблонов запросов в DAX
Использование функции ROW для проверки мер
Функция SUMMARIZE
Функция SUMMARIZECOLUMNS
Функция TOPN
Функции GENERATE и GENERATEALL
Функция ISONORAFTER
Функция ADDMISSINGITEMS
Функция TOPNSKIP
Функция GROUPBY
Функции NATURALINNERJOIN и NATURALLEFTOUTERJOIN
Функция SUBSTITUTEWITHINDEX
Функция SAMPLE
Автоматическая проверка существования данных в запросах DAX
Заключение
Глава 14. Продвинутые концепции языка DAX
Знакомство с расширенными таблицами
Функция RELATED
Использование функции RELATED в вычисляемых столбцах
Разница между фильтрами по таблице и фильтрами по столбцу
Использование табличных фильтров в мерах
Введение в активные связи
Разница между расширением таблиц и фильтрацией
Преобразование контекста в расширенных таблицах
Функция ALLSELECTED и неявные контексты фильтра
Знакомство с неявными контекстами фильтра
ALLSELECTED возвращает строки из итераций
Применение функции ALLSELECTED без параметров
Функции группы ALL*
Функция ALL
Функция ALLEXCEPT
Функция ALLNOBLANKROW
Функция ALLSELECTED
Функция ALLCROSSFILTERED
Использование привязки данных
Заключение
Глава 15. Углубленное изучение связей
Реализация вычисляемых физических связей
Создание связей по нескольким столбцам
Реализация связей на основе диапазонов
Циклические зависимости в вычисляемых физических связях
Реализация виртуальных связей
Распространение фильтров в DAX
Распространение фильтра с использованием функции TREATAS
Распространение фильтра с использованием функции INTERSECT
Распространение фильтра с использованием функции FILTER
Динамическая сегментация с использованием виртуальных связей
Реализация физических связей в DAX
Использование двунаправленной кросс-фильтрации
Связи типа «один ко многим»
Связи типа «один к одному»
Связи типа «многие ко многим»
Реализация связи «многие ко многим» через таблицу-мост
Реализация связи «многие ко многим» через общее измерение
Реализация связи «многие ко многим» через слабые связи
Выбор правильного типа для связи
Управление гранулярностью
Возникновение неоднозначностей в связях
Появление неоднозначностей в активных связях
Устранение неоднозначностей в неактивных связях
Заключение
Глава 16. Вычисления повышенной сложности в DAX
Подсчет количества рабочих дней между двумя датами
Данные о продажах и бюджетировании в одном отчете
Расчет сопоставимых продаж по магазинам
Нумерация последовательности событий
Вычисление продаж по предыдущему году до определенной даты
Заключение
Глава 17. Движки DAX
Знакомство с архитектурой движков DAX
Введение в движок формул
Введение в движок хранилища данных
Движок хранилища данных VertiPaq
Движок хранилища данных DirectQuery
Процедура обновления данных
Принципы работы движка хранилища данных VertiPaq
Введение в столбчатые базы данных
Сжатие данных движком VertiPaq
Сегментация и секционирование
Использование представлений динамического управления
Использование связей в движке VertiPaq
Материализация
Агрегирование
Выбор аппаратного обеспечения для VertiPaq
Возможность выбора аппаратного обеспечения
Приоритеты при выборе аппаратного обеспечения
Модель центрального процессора
Быстродействие памяти
Количество ядер процессора
Объем памяти
Дисковый ввод/вывод и постраничная подкачка
Заключение
Глава 18. Оптимизация движка VertiPaq
Сбор информации о модели данных
Денормализация
Кратность столбцов
Работа с датой и временем
Вычисляемые столбцы
Оптимизация сложных фильтров при помощи булевых вычисляемых столбцов
Обработка вычисляемых столбцов
Выбор столбцов для хранения
Оптимизация хранения столбцов
Оптимизация при помощи разделения столбцов
Оптимизация столбцов с высокой кратностью
Отключение иерархий атрибутов
Оптимизация атрибутов детализации
Управление агрегированием VertiPaq
Заключение
Глава 19. Анализ планов выполнения запросов DAX
Перехват запросов DAX
Введение в планы выполнения запросов
Создание плана выполнения запроса
Логический план выполнения запроса
Физический план выполнения запроса
Запросы движка хранилища данных
Сбор информации для оптимизации
Использование DAX Studio
Использование SQL Server Profiler
Чтение запросов движка хранилища VertiPaq
Введение в синтаксис xmSQL
Время сканирования
Внутренние события DISTINCTCOUNT
Параллелизм и кеш данных
Кеш движка VertiPaq
Функция обратного вызова CallbackDataID
Чтение запросов движка хранилища DirectQuery
Анализ составных моделей данных
Использование агрегатов в модели данных
Чтение планов выполнения запросов
Заключение
Глава 20. Оптимизация в DAX
Выбор стратегии оптимизации
Выделение выражения DAX для оптимизации
Создание проверочного запроса
Анализ времени выполнения запроса и информации из плана
Поиск узких мест в движке формул и движке хранилища данных
Внесение изменений и повторные запуски тестовых запросов
Оптимизация узких мест в выражениях DAX
Оптимизация условий фильтрации
Оптимизация преобразования контекста
Оптимизация условных выражений IF
Снижение влияния функции CallbackDataID на производительность
Оптимизация вложенных итераторов
Отказ от использования табличных фильтров с функцией DISTINCTCOUNT
Уход от множественных вычислений путем использования переменных
Заключение
Предметный указатель