0%

计算连续N个月满足条件的客户数量

当前有一个需求,要计算过去三个月,每个月都有销售额的客户有多少个。

数据Demo如下图:

1

在实际计算中,有很多方式来计算,不过经过优化,最终确定使用两种计算方案。

使用虚拟表来计算

CountCustomers = 
-- 第4步,对于第3步筛选出来的表,求行数
COUNTROWS(
	-- 第2步,基于第一步的表,建立虚拟表,包含CustomerID列和计算出来的有销量的月数。
	FILTER(
		SUMMARIZE(
			-- 第1步,筛选出只包含202302-202304的数据的表
			FILTER(
				Sales,
				Sales[YearMonth] >= "202302" && Sales[YearMonth] <= "202304"
			),
			Sales[CustomerID],
			"SalesMonths", DISTINCTCOUNT( Sales[YearMonth] )
		),
		-- 第3步,在Filter中对于第2步的虚拟表,筛选出有销量约束等于3的月。
		[SalesMonths] = 3
	)
)

2

公式并不复杂,对于初学者,有几点可以作为参考:

  1. SUMMARIZE( ) 中,第一个参数是表,而Filter( )的结果也是一个表,所以可以用Filter( )作为SUMMARIZE( )的第一个参数。
  2. 同理,COUNTROWS( ),第一个参数也是表,也可以用Filter( )的结果作为第一参数。
  3. 在Filter( )中的虚拟表中建立的虚拟列,可以作为Filter( )的第二参数进行条件判断。

不使用虚拟表进行计算

CountCustomers = 
CALCULATE(
	DISTINCTCOUNT( Sales[CustomerID] ),
	FILTER(
		ALL( Sales[CustomerID] ),
		CALCULATE(
			DISTINCTCOUNT( Sales[YearMonth] ),
			Sales[YearMonth] >= "202302" && Sales[YearMonth] <= "202304"
		) = 3
	)
)

这个计算方式,我没有仔细去分析和前一个方式的运算效率哪个更高。不过从我的感觉来看,两个计算方式运行效率应该差不多,估计在百万行级别以下运行效率不会有明显差异。如果到亿行级别以上,我估计第一种的效率更高。