0

我正在研究 Google 广告数据中心,并且对 bigquery(一般是 sql)比较陌生。在某种情况下,我试图通过基于参数输入来做一个动态组(我相信参数需要是一个数组?)

所以如果说我的表有四个字段(两个是数字,两个是字符串)

我想要一个场景,我正在对字符串变量中的一个或两者一起进行分组

因此,根据我的参数输入,我的数据将根据所选输入进行分组,并对数值数据应用某种数学运算(比如平均值)

目前,我只能组合不同的字符串列(假设我有年龄和姓名作为我的列,所以我有一个年龄列、一个姓名列和一个年龄名称列)但是当我的字符串列超过一个数字时,这种解决方法就会崩溃因为可能有太多的组合。

有没有办法动态提供我想按表分组的列并在我的输出中选择这些列和数值(后聚合)?

样本输入:

口袋妖怪 地点 价值
乔尔顿 城市1 230
乔尔顿 城市2 210
翁布雷翁 城市2 240
翁布雷翁 城市2 180
翁布雷翁 城市3 180
埃斯佩恩 城市3 260
埃斯佩恩 城市3 100
埃斯佩恩 城市4 300

如果我提供 @hierarchy 参数作为字符串数组。聚合逻辑在这里是平均的。

如果输入是“口袋妖怪”,则输出

口袋妖怪 价值
乔尔顿 220
翁布雷翁 200
埃斯佩恩 220

如果输入是“口袋妖怪,位置”,则输出

口袋妖怪 地点 价值
乔尔顿 城市1 230
乔尔顿 城市2 210
翁布雷翁 城市2 210
翁布雷翁 城市3 180
埃斯佩恩 城市3 180
埃斯佩恩 城市4 300

注意:请注意,这只是在 2 个字段的情况下,但如果我的潜在参数输入可以有超过 3,4 个因素,并且最终输出具有按这 3,4 个因素分组的数据,然后在数值上预先决定聚合逻辑字段。

4

2 回答 2

0

尝试EXECUTE_IMMEDIATE

DECLARE columns STRING;

CREATE TEMPORARY TABLE mytable as
select "Jolteon" as pokemon, "City1" as location, 230 as value union all
select "Jolteon", "City2", 210 union all
select "Umbreon", "City2", 240 union all
select "Umbreon", "City2", 180 union all
select "Umbreon", "City3", 180 union all
select "Espeon", "City3", 260 union all
select "Espeon", "City3", 100 union all
select "Espeon", "City4", 300
;

SET columns="pokemon, location";
EXECUTE IMMEDIATE "SELECT " || columns || ", AVG(value) as value FROM mytable GROUP BY " || columns;

在此处输入图像描述

于 2021-06-24T05:36:23.287 回答
0

如果我将@hierarchy 参数作为字符串数组提供...

考虑下面

DECLARE hierarchy ARRAY<STRING>;
SET hierarchy = ['pokemon', 'location'];
EXECUTE IMMEDIATE 'SELECT ' || ARRAY_TO_STRING(hierarchy, ',') || 
', AVG(value) as value FROM `project.dataset.table` GROUP BY ' || ARRAY_TO_STRING(hierarchy, ',');  

如果应用于您问题中的样本数据 - 输出是

在此处输入图像描述

如果SET hierarchy = ['pokemon'];- 输出是

在此处输入图像描述

于 2021-06-24T07:02:17.807 回答