Страницы: 1
RSS
Динамическая выборка по критерию DAX
 
Здравствуйте.
Начинаю осваивать POWER)
В частности Power Pivot i Power BI.
Не могу сообразить как "на лету" сформировать таблицу.

Пример:
Есть таблица переездов техники, но переезды бывают не каждый день.
Нужен отчет, который показывает последнее местонахождение на конкретную дату.

Пока реализовал через CROSSJOIN справочника техники и календаря и подтягиваю местонахождение,
но такая реализация кажется мне какой то кривой.
Можно ли как то вычислить максимальную дату меньше указанной и вернуть список техники?
Спасибо.
 
Dima S, для осваивания нелегкую задачку Вы решили сделать! Я вот только на 50% смог ее решить (если только мерами решать):
Цитата

вычислить максимальную дату меньше указанной
, а вот вытащить текстовую составляющую пока не смог. Может другие доведут до ума мой метод.
Изменено: Vladimir Chebykin - 14.01.2020 14:28:12
 
Dima S, вам таки на выходе нужна таблица или сводная? Если таблица, то это проще через Power Query  все же сделать.
З.Ы. Накидал вариант реализации через меру. В зелененькую табличку вносите дату, потом обновляете сводную.
Изменено: PooHkrd - 14.01.2020 15:12:59
Вот горшок пустой, он предмет простой...
 
Доброе время суток
Цитата
Vladimir Chebykin написал:
а вот вытащить текстовую составляющую пока не смог
И не сможете в такой конфигурации модели ;)
Приношу свои извинения. Возможно.
Код
=Var vrow = CALCULATETABLE(TOPN(1; 'Таблиця1'; 'Таблиця1'[Date]; DESC);
   FILTER(ALL('Calendar'[Date]);
      'Calendar'[Date]<=MAX('Calendar'[Date])
   )
)
Return SUMMARIZE(vrow; 'Таблиця1'[Location])

Хотя так и не уловил, как неявно дофильтрация происходит.

Вот если разорвать связь календаря с фактами, то да - это возможно
Код
=Var maxDate = MAX('Calendar'[Date])
Var vehicle = VALUES('Таблиця1'[Vehicle])
Return IF(COUNTROWS(vehicle) = 1;
   Var vrows = FILTER('Таблиця1'; 'Таблиця1'[Date] < maxDate && 'Таблиця1'[Vehicle] = vehicle)
   Return SUMMARIZE(TOPN(1; vrows; 'Таблиця1'[Date]; DESC); 'Таблиця1'[Location])
   ;
   BLANK()
)

Создать виртуальную таблицу в Power BI пока получилось только так топорно :(
Код
Таблица = Var vrows = FILTER('Таблиця1'; 'Таблиця1'[Date] < DATE(2019; 4; 21))
Var stats = SUMMARIZE(vrows; 'Таблиця1'[Vehicle]; "last date"; MAX('Таблиця1'[Date]))
Var joined = NATURALINNERJOIN(vrows; stats)
Return FILTER(joined; 'Таблиця1'[Date] = [last date])
Изменено: Андрей VG - 14.01.2020 16:17:53
 
Андрей VG, аплодирую стоя! Очень круто, я сходу не могу в курить, как это работает!
 
Цитата
Vladimir Chebykin написал:
я сходу не могу в курить, как это работает!
В общем то так же как и у вас. В рядовой ячейке меры. Замена фильтра по Calendar в CALCULATETABLE даёт подтаблицу от Таблиця1, для данного Vehicle изменения, задаваемого сводной. TOPN отбирает строку с максимальной датой из этой подтаблицы. Так как все даты уникальны, то строка одна :)  Следовательно осталось забрать значение по положению - для этого и используется SUMMARIZE. Можно было и SELECTCOLUMNS использовать.
 
Спасибо всем.
Цитата
PooHkrd написал:
таблица, то это проще через Power Query  все же сделать.
Нужна таблица, но я планирую перенести это дело в Power BI и выбирать дату с помощью разделителя.
А как передать выбранную дату в Power Query я не знаю.
В принципе и с DAX тоже проблемы.
Создал CALENDARAUTO  и меру
Код
CurDate = MAX('MyCalendar'[Date])

но почему то ни одно решение ( решение PooHkrd  все таки реагирует - у меня был какой то кривой виджет с магазина. со стандартным работает)   не реагирует на выбранное в разделителе значение.
Например в решении Андрея
Код
Таблица = Var vrows = FILTER('Таблиця1'; .'Таблиця1'[Date] < DATE(2019; 4; 21))

когда дата указанна жестко - все работает, если как мера - нет.

Можно это как то победить?
Изменено: Dima S - 15.01.2020 10:57:52
 
Dima S,
Вы сейчас про Power BI говорите? Могу посоветовать только следующее: возьмите мой файл из сообщения #2, в него вставьте меру Андрея, должно все заработать без проблем. Потом сравните со своей моделью, может найдете ошибку.
 
Цитата
Dima S написал:
если как мера - нет.
Дмитрий, не уподобляйтесь однопостовым ТС. Или прикладывайте пример или не забывайте описывать что, где, когда.
Вариант для понимания.
 
созданная "на лету" таблица не реагирует на разделитель.
 
Цитата
Dima S написал:
созданная "на лету" таблица не реагирует на разделитель.
она не на лету создана, а в момент загрузки модели, естественно она не будет реагировать на срезы в визуализации.
Чем вас не устроило решение от PooHkrd? Там как раз все работает как вам надо.
 
StepanWolkoff, я так понял что из-за этого
Цитата
Dima S написал:
я планирую перенести это дело в Power BI и выбирать дату с помощью разделителя
Не очень я в курсе кто-такой разделитель в PBI, и как с его помощью выбирать даты.
Но опять же в принципе мое решение можно переделать и таблицу куда, подставляется дата сделать в виде таблицы календаря и выбирать в нем по фильтру нужную дату, а далее через ALLSELECTED передавать в меры нужное значение. Но это уже не задача, а мутор, лично у меня желания это все допиливать нету. Если ТС захочет, думаю - реализует. Идея то вроде не сложная.
Вот горшок пустой, он предмет простой...
 
PooHkrd, ну я как раз скачал файл demo.pbix посмотрел, что автор хочет. Сделал, по сути тоже самое, что у вас, только через Keepfilters. Все отлично работает. Возможности только нет загрузить сюда сейчас
 
Цитата
StepanWolkoff написал:
только через Keepfilters.
Степан, можете показать саму меру? А то у меня какой-то монстр получился :(
 
Андрей VG, пожалуйста
Дата
Код
Max Date = 
var _maxdate=MAX('Calendar'[Date])
return
CALCULATE(MAX('Таблиця1'[Date]);KEEPFILTERS('Таблиця1'[Date]<=_maxdate))


Место
Код
Last Location = 
var _maxdate = [Max Date]
return
CALCULATE(VALUES('Таблиця1'[Location]);KEEPFILTERS('Таблиця1'[Date]=_maxdate))
 
Степан, большое спасибо!
Это получается я методом гланды автогеном через одно место пошёл :(
 
все получилось, причем разными вариантами.
Всем спасибо.
Изменено: Dima S - 16.01.2020 15:10:17
Страницы: 1
Наверх