使用全局参数时的同环比计算
场景1
部分场景下,用户在页面上使用日期筛选器联动了卡片里的全局参数,结果发现卡片里使用系统自带的高级计算--同环比时,计算无结果或者结果错误。
原因:同环比是基于日期字段查询当期数据和历史数据,用全局参数过滤日期,系统无法取到筛选范围外的历史日期数据。
解决方案:通过全局参数筛选日期范围时,不能使用系统自带的同环比功能,需创建计算字段进行计算。
案例:日期筛选器选取日期范围,联动页面上多个卡片,但是有个别卡片只需要联动日期范围里的期末日期,展示期末数据和同环比数据。如下图。
实现方法:
卡片里分别新建字段引用2个日期类型全局参数。
分别新建计算字段,在公式里筛选日期计算当期数据和同环比数据,然后拖入数据栏。这里计算仅用到了“结束日期”,不需要另外筛选日期,保存卡片。
当期:sum(case when [日期]=[结束日期] then [数值] else 0 end)
年同比:sum(case when [日期]=[结束日期]-interval 1 year then [数值] else 0 end)
增长率:([当期]-[年同比])/[年同比]
页面上新建日期筛选器,联动界面选择卡片里使用的2个日期参数即可。“开始日期”仅用于联动设置,不参与筛选和计算。
场景2
使用系统自带的同环比计算时,仅显示筛选日期范围内(当期)的维度和数据,当期没有、以前有的维度和数据不会显示并参与计算。如果要数据完整显示,一般需要在ETL里补齐数据,但是补齐数据会造成数据膨胀进而可能引发效率和性能问题,所以更推荐在卡片里使用全局参数来解决同环比数据缺失的问题。以下实现方法以下图为例。
实现方法:
制作卡片,新建计算字段,在公式里筛选日期计算当期数据和同环比数据,然后拖入数据栏,聚合方式选求和。卡片里不需要另外筛选日期,保存卡片。
当期销售额:case when trunc([日期],'MM')=trunc([DYNAMIC_PARAMS.日期],'MM') then [销售金额] else 0 end
上月:case when trunc([日期],'MM')=trunc([DYNAMIC_PARAMS.日期],'MM')-interval 1 month then [销售金额] else 0 end
年同比:case when trunc([日期],'MM')=trunc([DYNAMIC_PARAMS.日期],'MM')-interval 1 year then [销售金额] else 0 end
解释:本案例日期筛选的月份,是一个日期区间,但一个日期参数仅能指代一个日期,所以使用使用 trunc 函数取到月初第一天日期,对日期所在月份和参数日期所在月份进行判断,确保筛选到一整个月的数据。
在页面上新建选择筛选器,使用数据集里的日期字段, 选择“月”,默认值可以使用“自定义时间宏”(
{{{yesterday %yyyy-MM}}}
) 设置为显示昨天所在月份。关联卡片里用到的全局参数即可。
总结:
观察以上两个案例,可以发现,实现原理是一样的,都是通过逻辑条件筛选日期后再计算数据。所以借助日期函数,获取筛选日期和对比日期的范围,就可以轻松计算出同环比。Spark 日期函数请参考 Spark日期函数及应用 ,直连数据集请使用对应数据库函数,相关案例请参考 计算精确到具体时间的同环比。