DAX — подсчет вхождения

У меня есть простой список OpportunityID в модели данных PowerPivot, например:

OPPORTUNITY_ID    
1                   
2                
3                 
3                 
3                  
4                 
4                 
5                 

И я хочу добавить выражение DAX в CalculatedColumn, которое подсчитывает появление каждого OpportunityID, например:

OPPORTUNITY_ID    COUNT
1                 1    
2                 1
3                 1
3                 2
3                 3     
4                 1
4                 2
5                 1

Таким образом, при наличии нескольких вхождений OpportunityID счетчик будет отображаться кумулятивно, например. 1,2,3 и т.д.

Я пробовал много способов сделать это, но ничего не могу заставить работать. Я думаю, что ответ может заключаться в выражении RANKX, но я не понимаю, как заставить его работать.

Любая помощь будет оценена!


person user1811852    schedule 30.10.2013    source источник
comment
Вам понадобится комбинация CALCULATE, FILTER и EARLIER (последняя позволяет сравнивать с другими строками). См. это в качестве примера: sqlblog.com/blogs/alberto_ferrari/archive/2011/03/08/   -  person Andi Mohr    schedule 30.10.2013
comment
Зачем вам это нужно как вычисляемый столбец, а не вычисляемая мера?   -  person mmarie    schedule 03.11.2013
comment
Это обходной путь - я действительно хочу, чтобы это CALCULATE(SUM( только для уникальных записей, но поскольку функция DISTINCT не дает желаемого результата, моя идея состоит в том, чтобы использовать CALCULATE с фильтром для чего-либо с Count = 1   -  person user1811852    schedule 04.11.2013


Ответы (4)


Я не мог понять это с DAX, поэтому в конце концов я добавил эту строку SQL в запрос исходных данных.

SELECT    
ROW_NUMBER() OVER(PARTITION BY co.[OpportunityID] ORDER BY co.[OpportunityID] DESC) AS Row
person user1811852    schedule 04.11.2013

Правильная мера для этого в DAX:

DistinctOpportunities:=DISTINCTCOUNT([OpportunityID])
person Kyle Hale    schedule 10.08.2015

Попробуйте следующее: в DAX функция COUNTROWS будет подсчитывать все строки в переданной ей таблице. Используя функцию ФИЛЬТР, создайте подмножество OPPORTUNITYTABLE. Функция РАНЬШЕ дает контекст строки для аргумента столбца; в этом случае вызывается текущая строка в таблице. Таким образом, следующее выражение вернет количество строк в OPPORTUNITYTABLE, где 'OPPORTUNITYTABLE'[OPPORTUNITY_ID] соответствует текущей строке.

=COUNTROWS(
    FILTER(
       'OPPORTUNITYTABLE',
       'OPPORTUNITYTABLE'[OPPORTUNITY_ID]=                    
          EARLIER(
             'OPPORTUNITYTABLE'[OPPORTUNITY_ID ])
    )
)
person dylanmorgan    schedule 29.12.2015

Нет DAX-эквивалента оконной функции SQL ROW_NUMBER(). Без другого поля для детерминированного разрыва «связей» между идентичными строками вы не сможете достичь того же результата.

При этом очень легко суммировать только уникальные экземпляры в DAX. Постановка проблемы здесь не "мне нужно получить эквивалент SQL ROW_NUMBER()", а "мне нужно суммировать только уникальные вхождения". Первое — это единственный способ помочь в достижении второго.

В DAX мы можем использовать SUMMARIZE() для группировки по произвольным полям в таблице. Мы можем использовать SUMX() для перебора произвольной таблицы и накопления в сумме некоторого выражения, оцениваемого для каждой строки.

Таким образом, если у вас есть таблица

Opportunity_ID  |  Opportunity_Value
     1                   100
     2                   150
     3                   200
     3                   200
     3                   200
     4                   75
     4                   75
     5                   300

Затем мы можем использовать эту меру, чтобы получить сумму только различных значений для каждого Opportunity_ID.

UniqueSum:=
SUMX(
    SUMMARIZE(
        FactOpportunity
        ,FactOpportunity[Opportunity_ID]
        ,FactOpportunity[Opportunity_Value]
    )
    ,FactOpportunity[Opportunity_Value]
)

Здесь мы будем группировать по именованным полям в FactOpportunity. Таблица, определенная SUMMARIZE(), будет выглядеть следующим образом:

Opportunity_ID  |  Opportunity_Value
     1                   100
     2                   150
     3                   200
     4                   75
     5                   300

Затем SUMX() перебирает каждую строку в этой таблице результатов и оценивает значение [Opportunity_Value] в каждой строке. Они будут суммированы в сумму, что даст вам в общей сложности 825.

person greggyb    schedule 29.12.2015