Search
Write a publication
Pull to refresh

Особенности SUMMARIZECOLUMNS в DAX

Level of difficultyEasy
Reading time2 min
Views1.2K

Привет, Хабр! В аналитическом языке DAX одной из важных функций является SUMMARIZECOLUMNS. Эта функция готовит данные для дашбордов, также реализует декартово произведение полей группировки (если поля группировки из разных таблиц). Для понимания DAX полезно ознакомиться с особенностями SUMMARIZECOLUMNS, интересующимся деталями SUMMARIZECOLUMNS — добро пожаловать под кат :)

Функция SUMMARIZECOLUMNS из Power BI до сих пор развивается и дорабатывается Microsoft. Например, в 2024 году добавлено использование SUMMARIZECOLUMNS в мерах в Power BI. Синтаксис SUMMARIZECOLUMNS выглядит следующим образом:

Назначение параметров для группировки, фильтрации и выражений может быть интуитивно понятно, особенность SUMMARIZECOLUMNS заключается в декартовом произведении полей группировки. Для иллюстрации рассмотрим данные в таблице sales с полями productId, customerId и amount:

img3png

Для полей группировки из одной таблицы sales[productId] и sales[cusomerId] декартового произведения нет: 

img1png

Для полей группировки из разных таблиц products[productId] и customers[customerId] в результатах появляется декартово произведение:

img2png

Это одна из главных особенностей SUMMARIZECOLUMNS.

Есть также вторая особенность, связанная с декартовым произведением, — постраничный просмотр результатов SUMMARIZECOLUMNS. Например, рассмотрим 100 000 записей в таблице products и 100 000 записей в customers и простейший дашборд-матрицу.

Декартово произведение products[productId] на customers[cusatomerId] дает 100 000 x 100 000 записей, но благодаря постраничному просмотру результаты такой размерности благополучно отображаются в Power BI, и, конечно, нигде не хранятся 100 000 x 100 000 записей, а получаются постранично. Часть DAX для приведенного дашборда — это SUMMARIZECOLUMNS с размерностью результата 100 000 х 100 000

Видно, что Power BI в случае размерности 100 000 х 100 000 для SUMMARIZECOLUMNS разбивает результаты на страницы, условно по аналогии с действиями с разреженной матрицей, и не пытается хранить результат 100 000 х 100 000, что было бы неоптимально.

Естественно, что функционал, в чем-то аналогичный SUMMARIZECOLUMNS из аналитического языка DAX, может быть в большей или меньшей степени реализован на разных языках, например на C# (например, в NuGet пакете DaxSharp) или на других языках.

Надеюсь, приведенные особенности могут быть полезными, успешных дашбордов :)

Tags:
Hubs:
Total votes 2: ↑2 and ↓0+2
Comments0

Articles