让决策更智能
新一代智能数据分析平台

灵活日期筛选控制时间区间显示

观小远发表于:2020年08月01日 17:32:41更新于:2020年11月28日 16:56:51

需求背景

同一个页面下,只需要一个日期条件,但是控制的卡片需要显示所选日期近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 三年的数据。可视化效果如下。

0015f258cdc94809ef9c5977ec1f509

新增场景五:筛选日期 2019-10-17,显示 2019-10-01~2019-10-17 每天销售额、2019-10-01~ 2019-10-16 累计销售额(不统计2019-10-17当天)。

场景一:显示选择日期近7 天数据(可指定日期范围)

方法步骤:

(1)设置一个日期全局参数;

(2)卡片内新建1个计算字段,计算出每一行日期与对应传入的参数日期的间隔天数,通过差值进行自由范围控制,如下图;

0015f2588dc191a63e1ebdd024f78f5

(3)在卡片的筛选中,将上一步新建的计算字段拖入,然后设置控制区间;

0015f2588fe59f76a66ce3009dca2c6

(4)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。

0015f2589765ee90c5b7a8c2e584429

0015f25897683964362bf07bbb85ebd

场景二:显示选择日期所在月固定区间内数据

方法步骤:

(1)设置一个日期全局参数;

(2)卡片内增加3个计算字段,分别用来控制年月日的筛选,如下图;

0015f3210d736c8ba7cbe61837edcf3

0015f3210eb33f941871095ec962887

原理是计算出每一行日期,与对应传入的参数日期年月日的差值,通过差值进行自由范围控制

(3)在卡片的筛选中,将控制年月日的三个计算字段拖入,然后设置控制区间,日控制如下图,年、月分别设置为等于0;

0015f2589d73f204403b2425f85d2cc

(4)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。

场景三:显示选择日期近12个月数据

方法步骤:

(1)设置一个日期全局参数;

(2)卡片内增加2个计算字段,将传入日期参数的年月抽取出来;

       * 参数月:month([DYNAMIC_PARAMS.日期])

       * 参数年:year([DYNAMIC_PARAMS.日期])

0015f3217c8479eb334a02f5cde4b30

0015f3217c8817ed51f106877b4ffa0

(3)这一步很重要:原理是通过_开始年月<=数据集年月<=结束年月_的方式控制筛选范围,控制原理是互相做差即_开始年月-数据集年月<=0_的数据在需要显示的范围内,数据集_年月-结束年月_同样,这里结束年月其实就是参数年月。

       操作为:将数据集年月做控制计算前处理,新增3个计算字段如下:

       * 数据集年月:year([日期字段])*100+month([日期字段])

       * 开始年月:case when [参数月] =12 then [参数年]*100+1 when [参数月]<12 then ([参数年]-1)*100+[参数月]+1 end【逻辑:参数月为12月,就取当年1月;非 12 月,就取上一年选择月+1】

       * 结束年月:[参数年]*100+[参数月]

0015f3218c6795c73abb7a8ffd98e10

0015f3218cf7f50998413d6b58e67d0

0015f3218d658d69c6f5650ee6f2e0b

之所以要通过数值计算而不是直接用年月拼接的数值concat(),是因为年月拼接的单数月1月等处理后是20191而不是201901,会和双数月10月201910的计算出错,所以要这么处理

(4)增加2个字段,对年月做差:

      * 开始控制:[开始年月]-[数据集年月]

      * 结束控制:[数据集年月]-[结束年月]

0015f3218f3bbc128547f3d8f8c33bc

0015f3218fb4d59140d908520abb569

(5)将(4)中的两个字段放到卡片的筛选中,控制范围都为<=0;

0015f3219391bb7df408f228834df26

(6)添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数。

场景四:显示选择日期近 3 年数据

方法步骤

请完全参照场景三步骤新建字段,根据需求参考以下调整:

     * 开始年月:([参数年]-2)*100+1

     * 结束年月:[参数年]*100+[参数月]  (只到参数所在年月)

                           [参数年]*100+12   (参数所在年整年)

0015f323d5ea1427984587f74156f02

0015f323d66d6e1f24cd98dabe14b28

场景五:显示选择日期当天销售额、月初至昨天累计销售额

方法步骤:

1. 设置一个日期全局参数;
2. 卡片内增加3个计算字段,分别用来控制年月日的筛选,如下图;

0015fc2061641d66992517fbffbb85f

0015fc20620cdbbb51476abd8aeb287


原理是计算出每一行日期,与对应传入的参数日期年月日的差值,通过差值进行自由范围控制。
3. 在卡片的筛选中,将控制年月日的三个计算字段拖入,然后设置控制区间,日控制为大于等于 0(如下图),年控制、月控制分别设置为等于0。这么做可以只筛选出当月 1 号至当日的数据,不显示当日以后的数据。

0015fc2065b3a1fff5115f58cbfa571

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 后面。累计计算具体使用方法请参考[如何计算出月累计销售金额]

0015fc206b3c9cac240fcdd8111f81f5. 把日期字段拖到维度栏,把数据集里的销售金额字段拖到数值栏,聚合方式选“求和”,重命名为当日销售额;再把上一步新建好的字段“月初至昨日累计金额”也拖到数值栏,聚合方式选无处理。

注意:如果维度栏不放日期字段,那么“当日销售额”字段“求和”统计到的其实是月初至当日的累计销售额,而不是当日销售额,这时需要新建一个字段 case when [huikuan_date]=[DYNAMIC_PARAMS.日期] then [huikuan_price]
else 0 end

 并拖入数值栏来统计当日销售额,聚合方式选“求和”。两种方式效果对比如下图。

0015fc20c641723149d8337652bdad00015fc209c1114b7e35b9d68f460a43


6. 添加一个外部的时间筛选器,关联条件设置为关联卡片内使用的日期全局参数;或者新建参数筛选器,选择卡片内使用的日期全局参数

注意:以上所有计算字段使用的是系统内置 Spark SQL 函数,如卡片使用直连数据集,请使用对应数据库函数。






    您需要登录后才可以回复