道歉,如果这是一个简单的事情,但在阅读了几篇类似的帖子之后,我似乎无法找到正确的答案。
我基本上要做的是复制计算一组记录的平均值的功能。
下面是一个快速的SQL来演示我想要的内容。
DECLARE @T TABLE(CountryID int, CategoryID int, ProductID int, Price float)
INSERT INTO @T VALUES
(1,20, 300, 10),
(1,20, 301, 11),
(1,20, 302, 12),
(1,20, 303, 13),
(1,30, 300, 21),
(1,30, 300, 22),
(1,30, 300, 23),
(1,30, 300, 24),
(2,20, 300, 5),
(2,20, 301, 6),
(2,20, 302, 7),
(2,20, 303, 8),
(2,30, 300, 9),
(2,30, 300, 8),
(2,30, 300, 7),
(2,30, 300, 6)
SELECT
*
, AVG(Price) OVER(PARTITION BY CountryID, CategoryID) AS AvgPerCountryCategory
FROM @t
这给了我我需要的结果......
CountryID CategoryID ProductID Price AvgPerCountryCategory
1 20 300 10 11.5
1 20 301 11 11.5
1 20 302 12 11.5
1 20 303 13 11.5
1 30 300 21 22.5
1 30 300 22 22.5
1 30 300 23 22.5
1 30 300 24 22.5
2 20 300 5 6.5
2 20 301 6 6.5
2 20 302 7 6.5
2 20 303 8 6.5
2 30 300 9 7.5
2 30 300 8 7.5
2 30 300 7 7.5
2 30 300 6 7.5
如您所见,每行现在显示相应国家/类别的平均价格。在稍后阶段,这将用于计算与此平均值的差异,但是现在我只想达到这一点并尝试自己研究下一步。
那么在DAX中相当于AVG(Price) OVER(PARTITION BY CountryID, CategoryID)
的是什么?
计划结果还将考虑应用于Power BI中数据的任何过滤器。我不确定这个阶段是否重要。但是,这确实意味着在SQL中执行此工作可能不是一种选择。
我对DAX很新,所以解释任何建议的表达方式也会非常糟糕。
答案 0 :(得分:2)
您可以创建一个新的计算列,按如下方式为您提供:
AvgPerCountryCategory =
CALCULATE(AVERAGE('@T'[Price]),
ALLEXCEPT('@T', '@T'[CountryID], '@T'[CategoryID]))
这就是说我们对CountryID
和CategoryID
与当前行中的ID值匹配的所有行取平均值。 (它删除所有行上下文除之外的那些。)
这相当于这个版本:
AvgPerCountryCategory =
CALCULATE(AVERAGE('@T'[Price]),
ALL('@T'[ProductID], '@T'[Price]))
这次我们告诉它要删除哪些行上下文而不是保留什么。
另一种方法是删除所有行上下文,然后显式删除所需的部分:
AvgPerCountryCategory =
CALCULATE(AVERAGE('@T'[Price]),
ALL('@T'),
'@T'[CountryID] = EARLIER('@T'[CountryID]),
'@T'[CategoryID] = EARLIER('@T'[CategoryID]))
EARLIER
函数引用较早的行上下文。