使用 DAX 计算日期范围内不同日期的累计计数
Cumulated count of distinct dates in date ranges using DAX
我对 PowerPivot 和表格模型还是个新手,从关系数据库转换过来很困难。
我在 power pivot 中有两个表:Logbook 和 Calendar - 它们没有链接。日志行具有使用 [开始日期] 和 [结束日期] 列指定的日期范围。我有按 [Vehicle ID] 分组的日志行,并且我为每个 [Vehicle ID] 组添加了顺序 [Row ID]。
日志日期范围彼此重叠,我正在尝试编写一个度量,以给出日期范围内不同天数的累计计数。
日志Table:
Vehicle ID Row ID Start Date End Date *Cumulated Logged Days (Expected Result)*
AAA 1 1 Jun 2016 1 June 2016 1
AAA 2 1 Jun 2016 5 June 2016 5
AAA 3 10 Jun 2016 10 June 2016 6
BBB 1 1 Jun 2016 1 June 2016 1
BBB 2 5 Jun 2016 5 June 2016 2
BBB 3 7 Jun 2016 7 June 2016 3
这是我最好的尝试……
Cumulated Logged Days:
=CALCULATE(
COUNTROWS('Calendar'),
FILTER(
ALL(Logbook),
COUNTROWS(
FILTER(
Logbook,
EARLIER(Logbook[Vehicle ID]) = [Vehicle ID]
&& EARLIER(Logbook[Row ID]) <= [Row ID]
)
)
),
FILTER(
ALL('Calendar'),
'Calendar'[Date] >= MIN(Logbook[Start Date])
&& 'Calendar'[Date] <= MAX(Logbook[End Date])
)
)
他们说分而治之,这就是我在你的情况下所做的。基本上,需要的第一个计算是开始日期和结束日期之间的天数。一旦你得到两个日期之间的差异,你就可以累积这些值。让我们在 DAX 中实现它。
使用以下表达式在名为 DaysCount
的 LogBook
table 中创建计算列:
DaysCount :=
IF ( [Start Date] < [End Date], DATEDIFF ( [Start Date], [End Date], DAY ), 1 )
现在创建一个度量来获取累计天数:
Cumulated Logged Days :=
VAR currentVehicle =
LASTNONBLANK ( LogBook[Vehicle ID], 0 )
RETURN
CALCULATE (
SUM ( LogBook[DaysCount] ),
FILTER (
ALL ( LogBook ),
LogBook[Row ID] <= MAX ( LogBook[Row ID] )
&& currentVehicle = LogBook[Vehicle ID]
)
)
UPDATE DATEDIFF
函数在 Excel 2016 中受支持,因此如果您有不同的版本,DaysCount
计算列将无法工作
DaysCount 计算列的替代方法(在 Excel 2013 年测试):
=IF([Start Date]<[End Date], 1 * ([End Date]-[Start Date]),1)
DAX 2015 (Excel 2016) 中还包含对变量的支持,因此如果您有较早的版本,则必须将此表达式用于 Cumulated Logged Days
度量。
Cumulated Logged Days :=
CALCULATE (
SUM ( LogBook[DaysCount] ),
FILTER (
ALL ( LogBook ),
COUNTROWS (
FILTER ( LogBook, EARLIER ( LogBook[Vehicle ID] ) = LogBook[Vehicle ID] )
)
&& LogBook[Row ID] <= MAX ( LogBook[Row ID] )
)
)
Excel 2013 数据透视表中的最终结果。
如果有帮助请告诉我。
我对 PowerPivot 和表格模型还是个新手,从关系数据库转换过来很困难。
我在 power pivot 中有两个表:Logbook 和 Calendar - 它们没有链接。日志行具有使用 [开始日期] 和 [结束日期] 列指定的日期范围。我有按 [Vehicle ID] 分组的日志行,并且我为每个 [Vehicle ID] 组添加了顺序 [Row ID]。
日志日期范围彼此重叠,我正在尝试编写一个度量,以给出日期范围内不同天数的累计计数。
日志Table:
Vehicle ID Row ID Start Date End Date *Cumulated Logged Days (Expected Result)*
AAA 1 1 Jun 2016 1 June 2016 1
AAA 2 1 Jun 2016 5 June 2016 5
AAA 3 10 Jun 2016 10 June 2016 6
BBB 1 1 Jun 2016 1 June 2016 1
BBB 2 5 Jun 2016 5 June 2016 2
BBB 3 7 Jun 2016 7 June 2016 3
这是我最好的尝试……
Cumulated Logged Days:
=CALCULATE(
COUNTROWS('Calendar'),
FILTER(
ALL(Logbook),
COUNTROWS(
FILTER(
Logbook,
EARLIER(Logbook[Vehicle ID]) = [Vehicle ID]
&& EARLIER(Logbook[Row ID]) <= [Row ID]
)
)
),
FILTER(
ALL('Calendar'),
'Calendar'[Date] >= MIN(Logbook[Start Date])
&& 'Calendar'[Date] <= MAX(Logbook[End Date])
)
)
他们说分而治之,这就是我在你的情况下所做的。基本上,需要的第一个计算是开始日期和结束日期之间的天数。一旦你得到两个日期之间的差异,你就可以累积这些值。让我们在 DAX 中实现它。
使用以下表达式在名为 DaysCount
的 LogBook
table 中创建计算列:
DaysCount :=
IF ( [Start Date] < [End Date], DATEDIFF ( [Start Date], [End Date], DAY ), 1 )
现在创建一个度量来获取累计天数:
Cumulated Logged Days :=
VAR currentVehicle =
LASTNONBLANK ( LogBook[Vehicle ID], 0 )
RETURN
CALCULATE (
SUM ( LogBook[DaysCount] ),
FILTER (
ALL ( LogBook ),
LogBook[Row ID] <= MAX ( LogBook[Row ID] )
&& currentVehicle = LogBook[Vehicle ID]
)
)
UPDATE DATEDIFF
函数在 Excel 2016 中受支持,因此如果您有不同的版本,DaysCount
计算列将无法工作
DaysCount 计算列的替代方法(在 Excel 2013 年测试):
=IF([Start Date]<[End Date], 1 * ([End Date]-[Start Date]),1)
DAX 2015 (Excel 2016) 中还包含对变量的支持,因此如果您有较早的版本,则必须将此表达式用于 Cumulated Logged Days
度量。
Cumulated Logged Days :=
CALCULATE (
SUM ( LogBook[DaysCount] ),
FILTER (
ALL ( LogBook ),
COUNTROWS (
FILTER ( LogBook, EARLIER ( LogBook[Vehicle ID] ) = LogBook[Vehicle ID] )
)
&& LogBook[Row ID] <= MAX ( LogBook[Row ID] )
)
)
Excel 2013 数据透视表中的最终结果。
如果有帮助请告诉我。