gpt4 book ai didi

data-modeling - 优化 "where date between"类型查询的 Dax 和模型

转载 作者:行者123 更新时间:2023-12-03 04:15:30 25 4
gpt4 key购买 nike

我正在构建一个模型,以允许报告两个单独的数据集,在本例中,我们称学生数据集和员工数据集。

数据集非常独立,两者之间唯一真正的联系是日期,因此从模型的角度来看,有一个学生星型模式和一个员工星型模式。

显示的数据是快照类型数据,回答如下问题:- 对于选定的日期,显示所有在职员工- 对于选定的日期,显示所有注册的学生

这意味着,当选择单个日期时,模型会查找所选日期在就业开始和结束日期内的所有员工,并查找所选日期在注册开始和结束日期内的所有学生。

这意味着我必须做出决定,如何使用单个日期维度从每个模式返回正确的数据。创建关系不起作用,因为表格中的关系不允许“之间”类型查询,因此我有一个不相关的日期维度,并且每个模型的 Dax 都会找到适用的行。

问题是它不是性能最好的。对于大约 50k 行,添加度量可能需要 5-10 秒。

我问是否有更好的方法来编写查询,或者更改模型以仍然让我执行“之间”样式查询,但提供更好的性能。

下面是一个 dax 查询示例,用于返回在特定日期注册的所有学生。

感谢您的建议。

All Enrolled Students:=IF (
HASONEVALUE ( 'Date'[Date] ),
CALCULATE (
DISTINCTCOUNT ( 'Students'[StudentID] ),
FILTER (
'Students',
'Students'[StudentStartDateID] <= MIN ( 'Date'[DateID] )
&& 'Students'[StudentEndDateID] >= MAX ( 'Date'[DateID] )
)
),
BLANK ())

最佳答案

在某些情况下,不相关或“断开连接”的表非常适合为切片器、时间线和过滤器提供支持。正如您在问题中所说,您有两个优化选项:重新构建数据集优化现有的度量语法

重构数据集

复制开始日期和结束日期之间每一天的每一行,并有一列表示该迭代日期。这可以通过多种方式完成,具体取决于您获取数据集的方式,但可能很乏味。然后,将表与该迭代日期相关联,并使用该关系从“日期”过滤到“事实”。如果这是一个定期报告和/或您使用 SQL 来提取数据,那么利用 PowerPivot 的关系计算能力可能是值得的。

优化 DAX 语句

如果这是一次性请求,或者数据集太繁琐而无法每天复制,那么请坚持使用断开连接的表方法并清理度量语法。由于您已经包含了 MIN() 和 MAX() 函数,并且您的 CALCULATE() 返回 DISTINCTCOUNT(),因此条件 HASONEVALUE() 函数是不必要的。我在模拟环境中运行了此程序并获得了良好的结果,但这可能会因计算机性能和数据集大小而异。请参阅下面的清理语法。

All Enrolled Students:=CALCULATE (
DISTINCTCOUNT('Students'[StudentID]),
FILTER(
'Students',
'Students'[StudentStartDateID]<= MIN('Date'[DateID]) &&
'Students'[StudentEndDateID] >= MAX('Date'[DateID])
)
)

如果您的 StudentID 列是唯一的,这对我来说有意义,您可以进一步加快速度。

All Enrolled Students:=CALCULATE (
COUNT('Students'[StudentID]),
FILTER(
'Students',
'Students'[StudentStartDateID]<= MIN('Date'[DateID]) &&
'Students'[StudentEndDateID] >= MAX('Date'[DateID])
)
)

如果 StudentID 不是数字,请将 COUNT() 替换为 COUNTA() 以获得所需的效果。

关于data-modeling - 优化 "where date between"类型查询的 Dax 和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39406861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com