首页 > 解决方案 > Power BI DAX 计数出现次数

问题描述

我有以下数据集:

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])
    )
 )

有人能指出我正确的方向吗?

标签: powerbidax

解决方案


您需要一个额外的列来标识列中每个键的位置。

在查询编辑器中添加一个索引列:

//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 中实现您想要的,方法是对每个键项进行分区、索引,然后重新组合分区:

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"

这个测试非常快,有 400k 行。


推荐阅读