我很难找到正确的查询来执行以下操作:假设我们以某种方式从用户处获取两列值的输入, 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
,以及本例中存在的其他关键字。
2条答案
按热度按时间mec1mxoz1#
在looker中,我认为这一切都可以很简单地通过使用模板过滤器而不是像现在这样的参数来完成。
基本上,模板过滤器会自动将所选条件应用于查询,因此不必使用当前的case语句显式说明所有可能的用户输入形式,只需
这一行可以替换所有的datestamp case语句--您还可以通过将brand filter添加到末尾来包含它,如:
那就应该编写所需的sql了!如果您为filter\u brand输入“foo”,为filter\u datestamp输入“forday”,则会显示:
将其作为派生表的完整lookml(我猜您正在尝试这样做)如下所示
让我知道,如果扫描或如果有什么是不合理的!另外,将来我会邀请你到我们的社区论坛discussion.looker.com发帖:)我们有很多lookerMaven,他们很乐意回答这样的问题。
icomxhvb2#
这可能是您的问题:
但为了这个,你每次都得做x。今天通过0昨天通过1最后一个“x”通过该“x”