Страницы: 1
RSS
BI. Расчет данных предыдущего периода
 
Имеется ежедневная выгрузка по абонентам с наличием у них проблем (предикторов) согласно систем мониторинга. В отчет попадает 15 предикторов.
Исходная таблица 'предикторы'. В нее добавляем вычисляемый столбец "отч.дир. кол-во пр-ов в день" для подсчета предикторов в одной строке (у абонента может быть несколько предикторов, одна строка в день на одного абонента).  Далее этот столбец используем для фильтрации, чтобы не считать ненужные строки.

Отчетный период - неделя. Для фильтрации сделал табличку дат "Даты предикторов".

Проблемы у абонента могут быть зафиксированы от 1 до 7 раз в неделю, т.е. от одного произвольного дня недели до ежедневной фиксации. Интересует повторяемость 5-7 дней из 7    и     7 дней из 7.

Чтобы посчитать количество попаданий абонента в недельный период сделал сводную:  
Код
отч.дир. Сводная по ПП = SUMMARIZE(FILTER('Предикторы','Предикторы'[отч.дир. кол-во пр-ов в день] > 0),
[пп],[Начало недели],[Конец недели], "ПП на неделе", COUNT('Предикторы'[ПП]))

Потом из нее вытаскиваю количество дней с проблемами в неделе в основную таблицу "предикторы" добавляя вычисляемый столбец:
Код
ПП на неделе = LOOKUPVALUE('отч.дир. Сводная по ПП'[ПП на неделе],'отч.дир. Сводная по ПП'[ПП],
'Предикторы'[ПП],'отч.дир. Сводная по ПП'[Начало недели],'Предикторы'[Начало недели])

Далее создаю визуальный элемент - таблицу, вытаскиваю фильтры на недельный период и технологию.
Считаю для каждого узла попадание абонентов в отчет с повторяемостью 5-7 дней из 7    и     7 дней из 7, мерами:
 
Код
отч.дир. 5-7 ПП = CALCULATE(DISTINCTCOUNT('Предикторы'[ПП]), FILTER('Предикторы', 
AND('Предикторы'[отч.дир. кол-во пр-ов в день]>0,AND('Предикторы'[ПП на неделе] >= 5,
 'Предикторы'[ПП на неделе] <= 7))))
 
Код
отч.дир. 7 ПП = CALCULATE(DISTINCTCOUNT('Предикторы'[ПП]), FILTER('Предикторы', 
AND('Предикторы'[отч.дир. кол-во пр-ов в день]>0,'Предикторы'[ПП на неделе] = 7)))

Подскажите, как  посчитать данные из предыдущего периода (недели)? Мне нужно, чтобы в одной таблице были данные отчетной недели, предыдущей и разница между ними.
Ссылка на файл BI: https://disk.yandex.ru/d/ksaVKZnRIL0ztQ
Вложить не получается из-за размера файла.
Изменено: Михаил Семенов - 09.04.2021 10:30:01
 
Вероятно, куча текста отпугивает. Если кратко, то так:

Подскажите, как  посчитать данные из предыдущего периода (недели)? Мне нужно, чтобы в одной таблице были данные отчетной недели, предыдущей и разница между ними.
Ссылка на файл BI: https://disk.yandex.ru/d/ksaVKZnRIL0ztQ

Использовал DAX
 
файл не смотрел
Цитата
Михаил Семенов написал:
как  посчитать данные из предыдущего периода (недели)?
можно решить следующей конструкцией:
Код
мера = CALCULATE([сумма];FILTER(ALL('Календарь[№ недели]),'Календарь[№ недели]=MAX('Календарь[№ недели])-1)))

Для того, чтобы мера работала, у Вас обязательно должен быть справочник календарь с непрерывными датами, в котором будет столбец с номером недели.
П.С. дублирую меру
мера = CALCULATE([сумма];FILTER(ALL('Календарь[№ недели]),'Календарь[№ недели]=MAX('Календарь[№ недели])-1)))
при оформлении кода почему-то минус закрасился
Изменено: Vladimir Chebykin - 09.04.2021 07:03:41
 
Таблица с датами и номерами недель имеется.
Вот мера, что считает необходимое значение:
Код
отч.дир. 7 ПП = CALCULATE(DISTINCTCOUNT('Предикторы'[ПП]), FILTER('Предикторы', 
AND('Предикторы'[отч.дир. кол-во пр-ов в день]>0,'Предикторы'[ПП на неделе] = 7)))

На её базе пробую ваше предложение:
Код
отч.дир. 7 ПП пред.1 = CALCULATE([отч.дир. 7 ПП] , FILTER(ALL('Даты предикторов'[Номер недели]),
 'Даты предикторов'[Номер недели] = MAX('Даты предикторов'[Номер недели])-1))

данных в таблице нет. Если убираю в
Код
MAX('Даты предикторов'[Номер недели])-1
минус один, то получаю те же данные, что и в отчетной неделе.

Почему нет данных, если пытаюсь уменьшить номер недели на один?
Изменено: Михаил Семенов - 09.04.2021 10:28:34
 
Михаил Семенов,
Не понятно зачем вы начало и конец недели столбцы сделали текстом. Если сделать тип даты, то вот мера

Код
PrevWeek = 
var _nw= MAX('Даты предикторов'[Начало недели])-7
return
 CALCULATE([отч.дир. 5-7 ПП],ALL('Даты предикторов'),'Даты предикторов'[Начало недели]=_nw)

Столбец:
Код
Начало недели = MAX( DATE(YEAR([Дата]),1,1), [Дата]-WEEKDAY([Дата],3) )


ps да и вобще я бы поработал над моделью - много лишнего и неоптимального
Изменено: StepanWolkoff - 09.04.2021 11:45:12
 
StepanWolkoff, это фактически первый опыт с неким планируемым итогом в BI. Хорошо, что не видели полный исходник, где порядка 50 вычисляемых таблиц плюс меры.

Даты текстом, это промежуточные  итоги перед написанием:
Код
Дни недели = FORMAT([Дата]-WEEKDAY([Дата],3),"DD.MM") & " - " & FORMAT([Дата]+7-WEEKDAY([Дата],2),"DD.MM.YY")
В основной таблице тоже есть вычисляемые начало и конец недели, там уже нормально, как в вашем примере.

Подскажите пожалуйста, у Вас
Код
MAX( DATE(YEAR([Дата]),1,1), [Дата]-WEEKDAY([Дата],3) )
можно же просто
Код
[Дата]-WEEKDAY([Дата],3)
зачем такие сложности?

Ваша мера работает, спасибо!
Почему Вы её написали через var _nw?
 
Цитата
Михаил Семенов написал:
MAX( DATE(YEAR([Дата]),1,1), [Дата]-WEEKDAY([Дата],3) )
Это в вашем файле так было) Я просто FORMAT убрал)
Цитата
Михаил Семенов написал:
Почему Вы её написали через var _nw?
Потому что в логическом выражении изменения контекста нельзя использовать CALCULATE, поэтому в переменную записываем результат, а затем используем как фильтр
 
StepanWolkoff, спасибо!
Мне ещё учиться и учиться...
Страницы: 1
Наверх