我想访问测量 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"
我们在这里看到以下内容:
换句话说,在计算 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 更快。
非常欢迎所有建议!预先感谢!
我认为你应该在这里使用参数而不是过滤器 并且您还需要将参数值放在“”和内部“”中进行比较,如下所示: {% if is_logged_in._parameter_value == "'true'" %} ${user_id}
我在我的实例上使用了这个方法,效果很好 让我们详细讨论一下,希望我能有所帮助