Looker:在液体 IF 条件下访问过滤器值

问题描述 投票:0回答:1

我想访问测量 SQL 行中流动 IF 语句内维度上的过滤器值。

我知道如果我的过滤器是一个参数,我可以做到这一点,并且我知道如果我使用派生表,我可以做到这一点,但我特别想对维度上的常规过滤器的过滤器值执行此操作,在度量的常规 SQL 行。我的目标不是实现某种计算,而是当由于特定的过滤器值而不需要情况/时间时,消除措施中不必要的情况/时间。

这是我的例子:

我有一个定义如下的措施:

  measure: distinct_users {
    type:  count_distinct
    sql:case when ${is_logged_in} then ${user_id} else NULL end;;
  }

这很有效,但是 case/when 会增加很多时间。我想做的是这样的:当我将 ${is_logged_in} 过滤为 true 时,不需要 case/when ,所以我只想使用 sql: ${user_id} 。这样,这个度量对于 ${is_logged_in} 的任何值都是正确的,并且当 ${is_logged_in} 被过滤为 true 时,我可以通过摆脱 case/when 来节省时间。

所以我制定了以下措施:

  measure: distinct_users_test {
    label: "No. of Registered Users"
    hidden: yes
    type:  count_distinct
    sql: {% if   is_logged_in._value =='true' %} ${user_id}  
               /* filtered  {% condition is_logged_in %}is_logged_in_condition{% endcondition %} 
                  {% parameter is_logged_in %} * {{ is_logged_in._value }} ** {{ is_logged_in }} */
         {% else %} case when ${is_logged_in} then ${user_id} else NULL end  
               /* not filtered  {% condition is_logged_in %}is_logged_in_condition{% endcondition %} 
                  {% parameter is_logged_in %} * {{ is_logged_in._value }} ** {{ is_logged_in }}  */   
         {% endif %} 
         /* _filters['is_logged_in']  */ ;;
    }

除了在过滤器设置为 true 时使用 Liquid IF 将 case/when 更改为仅 ${user_id} 之外,我还添加了注释以向我展示如何评估某些 Liquid 语句。

当 is_logged_in 被过滤为 yes 时,我得到的是该度量的 SQL 中的以下行:

 COUNT(DISTINCT case when ( page_events.user_id > 0  ) then  "user_id"  else NULL end  /* not filtered  is_logged_in_condition true *  **   */    /* _filters['is_logged_in']  */ ) AS "page_events.distinct_users_test"

我们在这里看到以下内容:

  1. IF条件失败,没有成功移除case/when
  2. 可以使用 CONDITION 或使用 {%parameter is_logged_in %} 在 SQL 字段中访问过滤器值,但这些不能在液体 IF 条件中使用
  3. 无法使用 ._value 或 {{ is_logged_in }} 访问过滤器值
  4. _filters['is_logged_in'] 无法在 SQL 字段中工作

换句话说,在计算 sql 行时过滤器值可用,但我不能在 IF 语句中使用它!

我也尝试过 is_logged_in._parameter_value 但出现 Looker 错误。

与 Looker 支持人员交谈后,我尝试了以下方法,但也不起作用:

#    html: {% assign is_logged_in = _filters['page_events.is_logged_in']  %} {{rendered_value}} ;;
#    sql: {% if   is_logged_in =='true' %} ${user_id}  /* success  {% condition is_logged_in %}filter_true{% endcondition %} {% parameter is_logged_in %} * {{ is_logged_in._value }} ** {{ is_logged_in }} */     {% else %}case when ${is_logged_in} then ${user_id} else NULL end  /* failure  {% condition is_logged_in %}filter_true{% endcondition %} {% parameter is_logged_in %} * {{ is_logged_in._value }} ** {{ is_logged_in }} */    {% endif %}  ;;

想法是 _filters['page_events.is_logged_in] 应该在 HTML 字段中工作,因此我可以为其分配一个值,然后在 sql 字段中使用该值,但它不起作用。

有什么建议吗??????

我确信这一定是可能的,因为过滤器值显然可以使用注释中的 {%parameter is_logged_in %} 获得,但我找不到任何在 IF 中使用它的方法。

再次,我知道我可以将过滤器更改为参数,然后使用 is_logged_in._parameter_value 但这并不能解决我的真正目标,即在很多地方使用它,通过消除不必要的情况/时间来使生成的 SQL 更快。

非常欢迎所有建议!预先感谢!

sql liquid looker lookml
1个回答
0
投票

我认为你应该在这里使用参数而不是过滤器 并且您还需要将参数值放在“”和内部“”中进行比较,如下所示: {% if is_logged_in._parameter_value == "'true'" %} ${user_id}

我在我的实例上使用了这个方法,效果很好 让我们详细讨论一下,希望我能有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.