powerbi - 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])
)
)
有人能指出我正确的方向吗?
解决方案
您需要一个额外的列来标识列中每个键的位置。
在查询编辑器中添加一个索引列:
//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 行。
推荐阅读
- gitlab-ci - gitlab-ci 测试构建失败
- string - 在 go 中创建子字符串会创建一种新的符号
- python - Dask datframe 比较两列并将结果(真,假)分配给另一列
- c# - 如何将 SmartAssembly 8 与 .NET 3.1+ 单文件可执行文件 (.EXE) 发布一起使用,而不是最终得到捆绑的、未混淆的依赖项?
- python - 如何从 Python 中的其他文件夹导入函数?
- java - 如何将 XML 报告转换为 TestNG Java 的 JSON 报告
- import - 通过发出 SELECT 查询无法看到重新导入的 InfluxDB 数据,它在哪里?
- c - 为什么我的 Idris FFI 函数没有打印 REPL 中的值?
- sql - 执行方法时 SQL3 错误数据类型不一致
- node.js - http代理中间件不适用于create-react-app