如何用数据库视图或SSAS Tabular实现Fact表的指定筛选逻辑?
需求实现方案及部署选择
一、SQL实现筛选逻辑
要筛选出Fact2中符合要求的记录,核心是先计算每个设备在Fact1中的最晚时间点,再对比Fact2的事件时间是否晚于该时间。以下是具体SQL代码:
WITH MaxDeviceTime AS ( SELECT DeviceKey, -- 将DateKey和TimeKey拼接为标准时间格式后转成datetime,取每个设备的最大值 MAX(CAST(CONCAT(Datekey, TimeKey) AS DATETIME)) AS MaxFact1DateTime FROM Fact1 GROUP BY DeviceKey ) SELECT f2.DeviceKey, f2.EventDateKey, f2.EventTimeKey, f2.ErrorKey FROM Fact2 f2 INNER JOIN MaxDeviceTime mdt ON f2.DeviceKey = mdt.DeviceKey -- 将Fact2的事件时间转成datetime后与Fact1的最晚时间比较 WHERE CAST(CONCAT(f2.EventDateKey, f2.EventTimeKey) AS DATETIME) > mdt.MaxFact1DateTime ORDER BY f2.DeviceKey, f2.EventDateKey, f2.EventTimeKey;
这段代码会精准筛选出与需求预期一致的记录。
二、部署方式选择:数据库视图 vs SSAS Tabular
优先选择数据库视图的场景
- 当该筛选逻辑需要被多个系统(如SSAS、Power BI、传统报表工具)复用时:数据库视图作为统一数据源,维护一次即可同步所有依赖方,避免逻辑不一致。
- 当Fact表数据量较大时:数据库的查询优化器能更好地处理索引扫描、连接操作,性能比SSAS Tabular中的DAX计算更稳定高效。
- 当需要依赖数据库层面的权限控制或定期刷新时:视图可直接继承数据库权限体系,配合调度任务实现数据更新更便捷。
选择SSAS Tabular实现的场景
- 该筛选逻辑仅服务于特定的SSAS Tabular模型分析需求,不需要被其他系统复用:可在模型内创建计算表,用DAX实现逻辑,避免额外维护数据库对象。
DAX实现示例:
FilteredFact2 = VAR MaxFact1Times = SUMMARIZE( Fact1, Fact1[DeviceKey], "MaxFact1DateTime", MAX(DATETIME(FORMAT(Fact1[Datekey], "0000-00-00"), FORMAT(Fact1[TimeKey], "00:00:00"))) ) RETURN FILTER( Fact2, DATETIME(FORMAT(Fact2[EventDateKey], "0000-00-00"), FORMAT(Fact2[EventTimeKey], "00:00:00")) > LOOKUPVALUE(MaxFact1Times[MaxFact1DateTime], MaxFact1Times[DeviceKey], Fact2[DeviceKey]) )
需注意,DAX处理超大表时性能可能不如数据库SQL,需根据实际数据量评估。
内容的提问来源于stack exchange,提问作者Ozra Hasannezhad
相关产品推荐
相关产品推荐

