灵活日期筛选控制时间区间显示
需求背景
同一个页面下,只需要一个日期条件,但是控制的卡片需要显示所选日期近7 天、日期所在月10~25号日、最近12个月、最近3年等多种时间区间范围数据。
例如筛选日期2019-10-17,要看卡片时间范围为:2019-10-11~2019-10-17共 7 天、2019-10-10~2019-10-25、2018-11~2019-10共12个月、2017~2019 三年的数据。可视化效果如下。
新增场景五:筛选日期 2019-10-17,显示 2019-10-01~2019-10-17 每天销售额、2019-10-01~ 2019-10-16 累计销售额(不统计2019-10-17当天)。
场景一:显示选择日期近7 天数据(可指定日期范围)
方法步骤:
(1)设置一个日期全局参数;
(2)卡片内新建1个计算字段,计算出每一行日期与对应传入的参数日期的间隔天数,通过差值进行自由范围控制,如下图;
(3)在卡片的筛选中,将上一步新建的计算字段拖入,然后设置控制区间;
(4)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。
场景二:显示选择日期所在月固定区间内数据
方法步骤:
(1)设置一个日期全局参数;
(2)卡片内增加3个计算字段,分别用来控制年月日的筛选,如下图;
原理是计算出每一行日期,与对应传入的参数日期年月日的差值,通过差值进行自由范围控制。
(3)在卡片的筛选中,将控制年月日的三个计算字段拖入,然后设置控制区间,日控制如下图,年、月分别设置为等于0;
(4)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。
场景三:显示选择日期近12个月数据
方法步骤:
(1)设置一个日期全局参数;
(2)卡片内增加2个计算字段,将传入日期参数的年月抽取出来;
* 参数月:month([DYNAMIC_PARAMS.日期])
* 参数年:year([DYNAMIC_PARAMS.日期])
(3)这一步很重要:原理是通过_开始年月<=数据集年月<=结束年月_的方式控制筛选范围,控制原理是互相做差即_开始年月-数据集年月<=0_的数据在需要显示的范围内,数据集_年月-结束年月_同样,这里结束年月其实就是参数年月。
操作为:将数据集年月做控制计算前处理,新增3个计算字段如下:
* 数据集年月:year([日期字段])*100+month([日期字段])
* 开始年月:case when [参数月] =12 then [参数年]*100+1 when [参数月]<12 then ([参数年]-1)*100+[参数月]+1 end【逻辑:参数月为12月,就取当年1月;非 12 月,就取上一年选择月+1】
* 结束年月:[参数年]*100+[参数月]
之所以要通过数值计算而不是直接用年月拼接的数值concat(),是因为年月拼接的单数月1月等处理后是20191而不是201901,会和双数月10月201910的计算出错,所以要这么处理。
(4)增加2个字段,对年月做差:
* 开始控制:[开始年月]-[数据集年月]
* 结束控制:[数据集年月]-[结束年月]
(5)将(4)中的两个字段放到卡片的筛选中,控制范围都为<=0;
(6)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。
注意:以上公式是基于抽取数据集(即spark函数)实现,如果是直连数据集,需要换成对应的数据库函数语法。
例如 ,在oracle直连数据集直接新建计算字段,卡片会报错 ORA-00904: "YEAR": invalid identifier。
原因是oracle不支持直接使用year、month函数取日期年份和月份。需要要改成 EXTRACT(MONTH FROM TO_DATE([DYNAMIC_PARAMS.日期],'DD')) 和 EXTRACT(MONTH FROM TO_DATE([DYNAMIC_PARAMS.日期],'DD'))
场景四:显示选择日期近 3 年数据
方法步骤:
请完全参照场景三步骤新建字段,根据需求参考以下调整:
* 开始年月:([参数年]-2)*100+1
* 结束年月:[参数年]*100+[参数月] (只到参数所在年月)
[参数年]*100+12 (参数所在年整年)
场景五:显示选择日期当天销售额、月初至昨天累计销售额
方法步骤:
1. 设置一个日期全局参数;
2. 卡片内增加3个计算字段,分别用来控制年月日的筛选,如下图;
原理是计算出每一行日期,与对应传入的参数日期年月日的差值,通过差值进行自由范围控制。
3. 在卡片的筛选中,将控制年月日的三个计算字段拖入,然后设置控制区间,日控制为大于等于 0(如下图),年控制、月控制分别设置为等于0。这么做可以只筛选出当月 1 号至当日的数据,不显示当日以后的数据。
4. 新建字段“月初至昨日累计金额”使用组合函数来计算月初至昨日累计金额。
条件函数 case when DAYOFMONTH([huikuan_date]) between 1 and DAYOFMONTH([DYNAMIC_PARAMS.日期])-1 then [huikuan_price]
else 0 end
可以筛选出月初至昨日的日销售明细,窗口函数 sum( ) over(partition by month([huikuan_date]) order by [huikuan_date]) 可以对月初至昨日的日销售明细进行累计计算。如果需要以更多维度来分组统计,可以按照顺序把维度字段放到 partition by 后面。累计计算具体使用方法请参考[如何计算出月累计销售金额]
5. 把日期字段拖到维度栏,把数据集里的销售金额字段拖到数值栏,聚合方式选“求和”,重命名为当日销售额;再把上一步新建好的字段“月初至昨日累计金额”也拖到数值栏,聚合方式选无处理。
注意:如果维度栏不放日期字段,那么“当日销售额”字段“求和”统计到的其实是月初至当日的累计销售额,而不是当日销售额,这时需要新建一个字段 case when [huikuan_date]=[DYNAMIC_PARAMS.日期] then [huikuan_price]
else 0 end
并拖入数值栏来统计当日销售额,聚合方式选“求和”。两种方式效果对比如下图。
6. 添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数
注意:以上所有计算字段使用的是系统内置 Spark SQL 函数,如卡片使用直连数据集,请使用对应数据库函数。
案例
Demo体验
案例下载
观远应用市场下载本案例到本地环境动态时间宏。