1

我无法提出执行以下操作的正确查询:假设我们以某种方式从用户那里获取两列的值,datestamp并且brand(发生的情况是Looker UI 将其提供给查询)。为简单起见,假设我们的架构包含两列,我只想将它们取回,所以:

SELECT brand, datestamp
FROM my_table
WHERE

我不知道我应该怎么写剩下的。这是所需的:

  • 用户可以键入yesterday, today,或类似的字符串,last x days然后将正确的日期传递给查询。x20181001

  • 用户能够指定brand应该等于什么并将其传递给查询。

    ( CASE
        WHEN position(' TO ' IN UPPER({% parameter filter_datestamp %})) > 0 THEN
                datestamp >= SUBSTR({% parameter filter_datestamp %}, 0, strpos(UPPER({% parameter filter_datestamp %}), ' TO ') - 1) AND
                datestamp <= SUBSTR({% parameter filter_datestamp %}, strpos(UPPER({% parameter filter_datestamp %}), ' TO ')  + 4)
                AND
                brand LIKE {% parameter filter_brand %}
    
        WHEN filter_datestamp = 'today' THEN datestamp = date_format(CURRENT_DATE,'yyyyMMdd')
        AND brand LIKE {% parameter filter_brand %}
    
    
        WHEN datestamp = 'yesterday' THEN datestamp = date_format(DATE_ADD('day', -1, CURRENT_DATE),'%Y%m%d')
        AND brand LIKE {% parameter filter_brand %}
    
        WHEN datestamp LIKE 'last % days' THEN datestamp >= date_format(DATE_ADD('day', -CAST(split({% parameter filter_datestamp %}, ' ')[2] AS INT), CURRENT_DATE),'%Y%m%d')
        AND brand LIKE {% parameter filter_brand %}
    
        ELSE datestamp LIKE {% parameter filter_datestamp %}
        AND brand LIKE {% parameter filter_brand %}
    
      END )
    

如果查询有效,则结果应该是具有branddatestamp等于用户想要的行数。所有行都是相同的(我实际上想要别的东西,但如果CASE解决了我想我可以这样做)。

请为我写下完整的查询。在这种情况下,我不确定, ,和其他关键字的去向WHERECASEWHENAND

4

2 回答 2

2

在 Looker 中,我认为这一切都可以通过使用模板过滤器而不是像现在这样的参数来相当简单地完成。

基本上,模板化过滤器会自动将选择的条件应用于查询,因此不必使用您当前拥有的 CASE 语句明确考虑所有可能的用户输入形式,您只需

{% condition filter_datestamp %} datestamp {% endcondition %}

这一行可以替换所有的日期戳案例语句——您也可以通过将品牌过滤器添加到末尾来包含品牌过滤器,例如:

 {% condition filter_datestamp %} datestamp {% endcondition %} 
 AND brand LIKE {% parameter filter_brand %}

那应该写出想要的SQL!如果您为 filter_brand 输入“foo”,为 filter_datesamp 输入“yesterday”,它会这样写:

SELECT brand, datestamp
FROM my_table
WHERE ((( datestamp ) >= ((DATE_ADD(CURDATE(),INTERVAL -1 day))) AND ( datestamp ) < ((DATE_ADD(DATE_ADD(CURDATE(),INTERVAL -1 day),INTERVAL 1 day)))))
 AND brand LIKE 'foo'

将其作为派生表的完整 LookML(我猜你正在尝试做的)看起来像

view: test {
  derived_table: {
    sql:
    SELECT brand, datestamp
    FROM my_table
    WHERE {% condition filter_datestamp %} datestamp {% endcondition %}
     AND brand LIKE {% parameter filter_brand %};;
  }


  filter: filter_datestamp {
    type: date
  }

  filter: filter_brand {
    type: string
  }

  dimension: brand {
    type: string
    sql: ${TABLE}.brand ;;
  }
  dimension: datestamp {
    type: date
    sql: ${TABLE}.datestamp ;;
  }
}

让我知道是否扫描或是否有任何不合理的地方!另外,将来我会邀请您在我们的社区论坛上发帖,网址为discourse.looker.com :) 我们那里有很多 Looker 专家,他们很乐意回答这样的问题。

于 2018-11-07T22:40:29.483 回答
-1

这可能是您的查询:

SELECT brand, datestamp   FROM my_table
 WHERE (DATE (datestamp) = DATE (NOW ())
     OR DATE (datestamp) >= DATE_SUB (DATE (NOW ()), INTERVAL 'x' DAY) DATE(NOW()))
       AND brand = '<>';

但是为此,您每次都必须通过 x。今天通过 0 昨天通过 1 最后一个'x' 通过那个'x'

于 2018-10-12T03:47:51.990 回答