变量案例

Guide
  • 开发人员
  • 报表
About 13 min

# 1 数据集日期过滤

为了提高数据集的查询效率,经常会需要在数据集中使用日期条件过滤条件,如下:

SELECT 
       ... 省略的sql
  FROM foodmart.sales_fact_sample a
  JOIN foodmart.time_by_day b ON a.time_id = b.time_id
 WHERE b.the_date >= '${arr.get(dt, 0, cdt.addMonth(-1, "yyyy-MM-dd") )}' 
   AND b.the_date <= '${arr.get(dt, 1, cdt.now("yyyy-MM-dd") )}' 
1
2
3
4
5
6

内置变量函数 arr.get(数组变量, 索引, 默认值): 获取数组变量中对应索引位的值,数组变量通常由日期范围查询组件生成,但是为了容错如果第一个传入值为单值也能正常工作

日期索引与值类型

如果您的数据库为Oracle或和Oracle一样存在 "日期字段(DATE 类型)与字符串比较时有隐式转换,索引失效" 的问题,请在使用字符串转日期函数把日期变量转换为日期, 如:

b.the_date <= 
   to_date('${arr.get(dt, 1, cdt.now("yyyy-MM-dd") )}', 'yyyy-MM-dd')
1
2

具体to_date函数请参考您当前使用的数据库,数据集定义中的查询脚本暂不支持统一函数

# 1.1 自助分析中日期变量赋值

# 场景1: 数据集未声明变量赋值

我们知道变量在没有提前声明的情况下也可以使用,不好的地方是:如果没有提前申明,在自助分析(图表设计)阶段就不知道在数据集中定义了哪些变量,变量的名称、数据类型是什么?是数组还是单值?

这种情况下我们就需要手工输入变量名(通常变量名需要统一约定或问询数据集维护人员), 选择变量类型,设定变量值,如下图操作,给日期范围变量赋值

# 场景2: 数据集已申明变量赋值

如果在数据集维护阶段,提前申明了变量,以及变量的默认值,那么在图表设计阶段打开变量设置则会自动弹出已声明的变量列表

# 1.2 看板中日期变量赋值

自助分析/图表设计阶段的变量赋值为临时变量,主要是为自助分析服务,因为一次临时的自助分析的图表也可能不用添加到看板。
同时,看板中的变量优先级也大于自助分析中的变量优先级
那么在看板设计阶段我们要怎么给变量赋值呢?

步骤如下:

  1. 添加日期范围组件
  2. 编辑日期范围组件,并添加关联对象环境变量(当然该日期控件还可以添加其他多个关联)
  3. 设定环境变量的key为数据集的中使用的变量dt

# 2 绑定变量到日期维度

通过上面的方法我们完整实现了数据集动态日期查询。但是,有一点不方便的是从自助分析步骤开始,使用者都必须知道日期范围的改变需要通过变量赋值才能生效, 这对于非技术会有一定障碍

如果不知道有日期变量存在的情况,仅拖拽日期维度到过滤栏,则查询则会是数据集动态查询日期 + 自助分析维度过滤日期两个独立的条件,最终形成交集,

问题

因为变量没有改变数据集过滤条件永远是固定的,无论维度过滤条件如何设置都只能查看数据集日期范围之内的数据

WITH S0 AS (
    SELECT
     -- ... 省略的sql
    FROM foodmart.sales_fact_sample a
      JOIN foodmart.time_by_day b ON a.time_id = b.time_id
      -- 1 数据集过滤条件,最近10天
     WHERE b.the_date >= '2025-12-15' 
     AND b.the_date <= '2025-12-25'
    )

SELECT DATE_FORMAT(`r_date`, '%Y-%m-%d') AS c_0,
       SUM(`store_sales`) AS v_0
  FROM S0
  -- 2 维度过滤设定的标记,最近一年
 WHERE `r_date`>=STR_TO_DATE('2024-12-25', '%Y-%m-%d')
 GROUP BY DATE_FORMAT(`r_date`, '%Y-%m-%d')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

有没有办法,即能使用变量查询数据集,又让使用自助分析的用户对日期变量无感呢?

答案是:绑定维度到变量

  1. 在数据集设计阶段,编辑日期维度
  2. 维度高级配置栏,绑定日期维度字段到变量dt,并限定日期过滤方式为范围过滤
  3. 在自助分析阶段,不对日期维度设置过滤条件使用默认过滤范围
  4. 通过常规维度过滤增加日期条件(行列维度、过滤栏不限),设定的日期值自动绑定到预设的变量dt

# 看板筛选器配置

同样,看板筛选器配置关联对象,也可以不用关心变量,直接把日期筛选器关联到日期字段即可, 从而实现让数据集使用者从自助分析到看板设计阶段都不用关心变量

提示

通过维度过滤器绑定的变量,仅对图表自身生效,不会应用到其他的图表组件