【问题标题】:Power BI DAX count occurencesPower BI DAX 计数出现次数
【发布时间】:2019-10-07 17:29:54
【问题描述】:

我有以下数据集:

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 中,我可以使用 =COUNTIF(A$2:A2,A2) 创建 CNT 列,但在 DAX 中无法获得相同的结果。 我尝试了以下方法,但没有生成相同的输出:

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

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

【问题讨论】:

  • cnt 列的值似乎取决于每个值在列(索引)中的位置,这取决于表的排序顺序。您是否有另一列要对其进行排序/索引?
  • 不,它不看位置,只需在 Excel 中尝试公式即可完成工作
  • Excel 公式也使用相对行引用来确定列表中的位置...您需要另一列来实现您想要的。
  • Power BI 不能使用数据集中的相对位置吗?
  • 仅当您创建索引时。没有原生的“行号”。

标签: powerbi dax


【解决方案1】:

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

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

//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 行。

【讨论】:

  • 如何改进这个公式以支持 400k+ 行?对于小型数据集,它可以工作,但对于大型数据集,它仍在计算中
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多