背景:
挑战:
Analyst进行需要MAX(datecol)的计算
在DAX中,在directquery模式下,这似乎无法实现,因此我将其推回到ETL并添加了MaxDate列。
现在这是一张大桌子,并且日渐变大。 DTA提出了一个列存储索引,这对我来说很有意义。但该索引建议仅基于SELECT查询。我还会有插入和删除(每日批处理),然后必须跟着它们:
UPDATE table SET MaxDate = MAX(Datecol)
我的直觉是,这对列存储索引不太好,但我还没有测试过它。也许取决于是集群还是非集群?
我说MaxDate必须在ETL中处理吗?在DirectQuery模式下尝试在DAX中执行会导致错误。
我是否认为必须注意列存储索引?或者它根本没有意义,因为索引重建是必要的?
我正在寻找一条有意义并避免问题的前进道路。
答案 0 :(得分:0)
使用MAXA()
功能定义您的度量。
我可以使用Tabular 2016以DirectQuery模式工作。
Max Date:=MAXA(table[datecol])
发给SQL Server的查询是这样的:
SELECT MAX([t0].[DateCol]) AS [a0] FROM ((SELECT * FROM table)) AS [t0]
如果您需要将值放在列中,则无法在直接查询模式下使用MAXA()
(此刻),因此我建议您修改表以使用查询作为源而不是直接表参考。
SELECT table.*,
max_date= (SELECT MAX(datecol) FROM dbo.table)
FROM dbo.table
如果您愿意,可以创建计算列:
days_offset = DATEDIFF(table[datecol], table[max_date], DAY)
*请注意,您无法使用分号终止语句,因为只要引擎构建对数据库的查询,它就会在子查询中使用。
如果表具有列存储索引,或者列具有非群集的行存储索引,则获取MAX(datecol)
的子查询应该非常有效。比使用新的最大日期每天更新表格中的每一行要有效得多。