我很难提出执行以下操作的正确查询:假设我们以某种方式从用户那里输入了两列datestamp
和brand
的值(结果是Looker UI将其提供给查询)。为简单起见,假设我们的架构同时包含两个列,而我只想将它们取回,所以:
SELECT brand, datestamp
FROM my_table
WHERE
我不确定该如何写其余的内容。这是需要的:
用户可以输入yesterday
或诸如today
之类的字符串来输入last x days
,x
,20181001
,然后输入正确的日期传递给查询。
用户可以指定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 )
如果查询有效,则结果应为brand
和datestamp
等于用户想要的行数。所有行都是相同的(我实际上想要其他东西,但是认为如果解决CASE
,我可以做到这一点。)
请为我写完整的查询。我不确定WHERE
在这种情况下相对于CASE
,WHEN
,AND
和其他关键字的位置。
答案 0 :(得分:2)
在Looker中,我认为只需使用documentation而不是像现在一样使用参数就可以轻松完成所有操作。
基本上,模板化过滤器会自动将选择的条件应用于查询,因此您不必拥有当前拥有的CASE语句就显式地考虑所有可能形式的用户输入,
{% condition filter_datestamp %} datestamp {% endcondition %}
该行可以替换所有datestamp案例语句-您还可以通过将其添加到末尾来包括品牌过滤器,例如:
{% condition filter_datestamp %} datestamp {% endcondition %}
AND brand LIKE {% parameter filter_brand %}
那应该写出所需的SQL!如果您为filter_brand输入“ foo”,为filter_datestamp输入“ 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 ;;
}
}
请让我知道该扫描是否正常,或者是否有没有任何意义!另外,将来我会邀请您在templated filters的社区论坛上发表文章:)我们那里有很多Looker专家,他们乐意回答这样的问题。
答案 1 :(得分:-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”