在预定查询bigquery中声明变量;

发布于 2025-02-11 02:55:55 字数 855 浏览 2 评论 0原文

我正在开发一个预定的查询,其中我正在使用with语句加入并从BigQuery滤掉几张表。为了过滤日期,我想声明以下变量: 声明初始日期;

SET initial = DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK);
SET final = LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK);

但是,在执行此查询时,我会得到两个结果。一个用于声明的变量(我对将它们作为输出不感兴趣),而最终选择的语句(作为我感兴趣的结果)。

主要问题是,每当我尝试将该计划的查询连接到Google Data Studio中的表时,我会收到以下错误:

无效的值:configuration.query.destinationtable无法为脚本设置;

如何声明变量而不结果是结束的变量?

在这里,您有一个我正在尝试使用的代码示例:

DECLARE initial, final DATE;
SET initial = DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK);
SET final = LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK);
WITH HelloWorld AS (

SELECT shop_date, revenue
FROM fulltable
WHERE shop_date >= initial
  AND shop_date <= final

)
SELECT * from HelloWorld;

I am developing a scheduled query where I am using the WITH statement to join and filtrate several tables from BigQuery. To filtrate the dates, I would like to declare the following variables:
DECLARE initial, final DATE;

SET initial = DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK);
SET final = LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK);

However, when executing this query, I am getting two results; one for the variables declared (which I am not interested in having them as output), and the WITH statement that is selected at the end (which as the results that I am interested in).

The principal problem is that, whenever I try t connect this scheduled query to a table in Google Data Studio I get the following error:

Invalid value: configuration.query.destinationTable cannot be set for scripts;

How can I declare a variable without getting it as a result at the end?

Here you have a sample of the code I am trying work in:

DECLARE initial, final DATE;
SET initial = DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK);
SET final = LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK);
WITH HelloWorld AS (

SELECT shop_date, revenue
FROM fulltable
WHERE shop_date >= initial
  AND shop_date <= final

)
SELECT * from HelloWorld;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鸩远一方 2025-02-18 02:55:55

with initial1 as ( select DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK) as initial2),

final1 as ( select LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK) as final2),

HelloWorld AS (
SELECT shop_date, revenue
FROM fulltable
WHERE shop_date >= (select initial2 from initial1) AND shop_date <= (select final2 from final1)
)

SELECT * from HelloWorld;

with initial1 as ( select DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK) as initial2),

final1 as ( select LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK) as final2),

HelloWorld AS (
SELECT shop_date, revenue
FROM fulltable
WHERE shop_date >= (select initial2 from initial1) AND shop_date <= (select final2 from final1)
)

SELECT * from HelloWorld;
凑诗 2025-02-18 02:55:55

使用 config 表只有1行并将其与您的表进行跨加入,您的查询可以像下面一样写入。

WITH config AS (
  SELECT DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK) AS initial,
         LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK) AS final
),
HelloWorld AS (
  SELECT * FROM UNNEST([DATE '2022-06-06']) shop_date, config
   WHERE shop_date >= config.initial AND shop_date <= config.final
)
SELECT * FROM HelloWorld;

With config table having just 1 row and cross-joining it with your table, your query can be written like below.

WITH config AS (
  SELECT DATE_TRUNC(DATE_TRUNC(CURRENT_DATE(), MONTH)+7,ISOWEEK) AS initial,
         LAST_DAY(DATE_TRUNC(CURRENT_DATE(), MONTH)+7, ISOWEEK) AS final
),
HelloWorld AS (
  SELECT * FROM UNNEST([DATE '2022-06-06']) shop_date, config
   WHERE shop_date >= config.initial AND shop_date <= config.final
)
SELECT * FROM HelloWorld;
怪我闹别瞎闹 2025-02-18 02:55:55

我使用过的几个模式:

  1. 如果您有许多具有相同返回类型(字符串)的模式,
CREATE TEMP FUNCTION config(key STRING)
RETURNS STRING AS (
  CASE key
    WHEN "timezone" THEN "America/Edmonton"
    WHEN "something" THEN "Value"
  END
);

则使用config(键)来检索值。

或者,

  1. 为每个常数创建一个函数
CREATE TEMP FUNCTION timezone()
RETURNS STRING AS ("America/Edmonton");

,然后使用TimeZone()获取值。

它每次都会执行该功能,因此不要在其中做一些昂贵的事情(例如从另一个表中选择)。

A few patterns I've used:

  1. If you have many that have the same return type (STRING)
CREATE TEMP FUNCTION config(key STRING)
RETURNS STRING AS (
  CASE key
    WHEN "timezone" THEN "America/Edmonton"
    WHEN "something" THEN "Value"
  END
);

Then use config(key) to retrieve the value.

Or,

  1. Create a function for each constant
CREATE TEMP FUNCTION timezone()
RETURNS STRING AS ("America/Edmonton");

Then use timezone() to get the value.

It would execute the function each time, so don't do something expensive in there (like SELECT from another table).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文