Power BI DAX подсчет событий - PullRequest
0 голосов
/ 06 октября 2019

У меня есть следующий набор данных:

KEY                    CNT
A-S000218691600_14       1
A-S000218691600_14       2
A-S000218691600_14       3
A-S000218696400_1        1
A-S000218691600_14       4
A-S000218691600_14       5
A-S000218691600_14       6
A-S000218691600_14       7
A-S000218691600_14       8
A-S000218693200_1        1
A-S000218691600_14       9
A-S000218691600_14      10
A-S000218691600_14      11
A-S00021869245175.29_1   1
A-S000218691600_14      12
A-S000218691600_14      13
A-S00021869110339.26_1   1
A-S000218691600_14      14
A-S000218696400_1        2
A-S000218691600_7        1
A-S000218691600_7        2
A-S000218691600_7        3
A-S000218691600_7        4
A-S000218691600_7        5
A-S000218691600_7        6
A-S000218691600_7        7
A-S0002186917600_1       1

В Excel я могу создать столбец CNT с помощью =COUNTIF(A$2:A2,A2), но у меня не может быть такого же результата в DAX. Я пробовал следующее, но без генерации того же результата:

 cnt = calculate(
     COUNTROWS(table),
     filter(
        ALLEXCEPT(table, table[key]),
        table[key]=EARLIER(table[key])
    )
 )

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 07 октября 2019

Вам нужен дополнительный столбец для определения позиции каждого ключа в столбце.

Добавьте столбец индекса в редакторе запросов:

//Table1
let
    Source = MyTable,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1)
in
    #"Added Index"

Теперь вы можете создать следующеевычисляемый столбец:

cnt = 
    CALCULATE ( 
        COUNTROWS ( Table1 ),
        FILTER ( 
            ALLEXCEPT ( Table1, Table1[Key] ),
            Table1[Index] <= EARLIER ( Table1[Index] )
        )
    )

Рабочий пример файла PBIX: https://pwrbi.com/so_58260475/

РЕДАКТИРОВАТЬ:

Чтобы ответить на ваш запрос о низкой производительности с большими наборами данных: вы можете достичь того, что выхочу в редакторе запросов, а не в DAX, путем разбиения по элементу Key, индексации и последующей рекомбинации разделов:

let
    Source = MyTable,
    #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
    #"Partition Keys" = Table.Group(#"Added Index", {"Key"}, {{"Data", each Table.AddIndexColumn(Table.Sort(_, {"Index", Order.Ascending}),"cnt",1,1), type table}}),
    #"Combine Partitions" = Table.Combine(#"Partition Keys"[Data])
in
    #"Combine Partitions"

Этот тест выполняется довольно быстро, с 400 тыс. строк.

...