我不明白但我假设的事情:
- Assets[ProductKey] 具有唯一值。
- Vends(从现在起我将其称为 Transactions)包含一列
与资产相关[ProductKey]
- Transactions[Date] 是一个日期/时间列
- Transactions 与 Dates 表相关,而 Dates 表与
资产。
我不知道您是如何尝试使用测量的,但我希望以下示例可以帮助您找到正确的路径。
我只在 1 月份排除了 Assets[ProductKey],如您在 assets 表图像中所见,即:
- Assets[ProductKey]=21 已从 2021 年 1 月 21 日 00:00 到 2021 年 1 月 22 日排除
00:00,
- Assets[ProductKey]=22 被排除在 2021 年 1 月 22 日 00:00 至
1/23/2021 00:00 等
您可以通过 RELATED 访问展开的 Transactions 表中的列。
FILTER(Transactions,
NOT(AND(
Transactions[TransactionDate]>=RELATED(Assets[ExcludedFromDate]),
Transactions[TransactionDate]<RELATED(Assets[ExcludedToDate]))))
在我的例子中。我用这个:
AVGNonExcludedTransactions :=
VAR SMZDateContext=SUMMARIZE(CalendarDateTime,CalendarDateTime[Year],CalendarDateTime[MonthName])
VAR NonExcludedTransactions=
FILTER(Transactions,
NOT(AND(
Transactions[TransactionDate]>=RELATED(Assets[ExcludedFromDate]),
Transactions[TransactionDate]<RELATED(Assets[ExcludedToDate]))))
VAR Result=
ADDCOLUMNS(SMZDateContext, "Count", CALCULATE(COUNTROWS(INTERSECT(
Transactions, NonExcludedTransactions))))
RETURN
AVERAGEX(Result,[Count])
...删除突出显示的行。 Assets 表中的每个 [ProductKey] 被排除一天,而 Transactions 表中的每个产品被排除一天以上。
可以通过将 INTERSECT() 更改为 EXCEPT() 并在日级别增加粒度来进行分析。
编辑:
在第二部分中,目标不是在 Transactions 表上使用 FILTER。但是,我认为可以通过将日期更改为数字来改进以下方法。而且我仍然不知道它是否比在 10M 行表上使用 FILTER 更有效。可能不会,因为需要少于 100 种产品和超过 200 万笔交易
这是模型的样子:
这次 TCountR 是一个更简单的度量:
TCountR = COUNTROWS(Transactions)
并且过滤器是用另一种方式计算的。使用单个 DateTime 列,其中包含 CalendarDateTime 粒度内每个产品的排除期:
AVGTCountRNonExcluded :=
VAR TotalRow =
SUMMARIZE(CalendarDateTime,CalendarDateTime[Year],CalendarDateTime[MonthName])
VAR AllCJ =
CROSSJOIN(SUMMARIZE(Products,Products[ProductKey]),SUMMARIZE(CalendarDateTime,CalendarDateTime[DateTime]))
VAR Excluded=
SELECTCOLUMNS(
GENERATE(Assets,
ADDCOLUMNS(
CROSSJOIN (
//Dates in Transactions should be rounded down at the hour level.
// -1 means that the day 1/2/2021 is not included
//From 1/1/2021 00:00 to 1/1/2021 23:00
////
//Without adding or subtracting a value:
//From 1/1/2021 00:00 to 1/2/2021 23:00
CALENDAR(Assets[ExcludedFromDate],Assets[ExcludedToDate]-1),
SELECTCOLUMNS(GENERATESERIES(0,23,1),"Time",TIME([Value],0,0))),
"DateTime", [Date] + [Time])),
"ProductKey", Assets[ProductKey], "DateTime", [DateTime])
VAR FilteredOut=EXCEPT(AllCJ,Excluded)
VAR Result = ADDCOLUMNS(TotalRow,"Count", CALCULATE([TCountR],KEEPFILTERS(FilteredOut)))
RETURN
AVERAGEX(Result,[Count])
结果是一样的。
编辑 2
为什么不呢?
如果您已经了解第二种方法,您可能想知道,如果我可以在我的 Transactions 表中添加一列并将 [TransactionDate] 格式从 DateTime 更改为 Date,并仅在 Date 级别使用 Dates 表,该怎么办。
示例:
1/1/2021 23:00 To 1/1/2021 00:00
1/2/2021 00:00 To 1/2/2021 00:00
代码变得更简单了:
AVGCountRowsDateLevel :=
VAR TotalRow= SUMMARIZE(Dates,Dates[Year],Dates[MonthName])
VAR AllCJ=CROSSJOIN(SUMMARIZE(Products,Products[ProductKey]),SUMMARIZE(Dates,Dates[Date]))
VAR Excluded=
SELECTCOLUMNS(
GENERATE(Assets,
DATESBETWEEN(Dates[Date],Assets[ExcludedFromDate],Assets[ExcludedToDate]-1)),
"ProductKey", Assets[ProductKey], "Date", [Date])
VAR FilteredOut=EXCEPT(AllCJ,Excluded)
VAR Result = ADDCOLUMNS(TotalRow,"Count", CALCULATE([TCountR],KEEPFILTERS(FilteredOut)))
RETURN
AVERAGEX(Result,[Count])
结果是一样的
正如我一开始所说,这是一个例子,希望能帮助你找到解决方案。