在Google BigQuery中,我有一个查询,该查询具有相同的字段名称,并在各种联接子查询中多次出现。我想将此字段名称抽象为一个临时函数,以便仅在函数内对其进行更改时,它将在所有地方进行修改。
这是我的查询:
SELECT *
FROM
(SELECT field1, COUNT(*) sq1_total
FROM table
WHERE condition = 1
GROUP BY field 1) sq1
LEFT JOIN
(SELECT field1, COUNT(*) sq2_total
FROM table
WHERE condition = 0
GROUP BY field 1) sq2
USING(field1)
这就是我想要的:
CREATE TEMP FUNCTION replace_field_name() AS (...);
SELECT *
FROM
(SELECT replace_field_name(), COUNT(*) sq1_total
FROM table
WHERE condition = 1
GROUP BY replace_field_name()) sq1
LEFT JOIN
(SELECT replace_field_name(), COUNT(*) sq2_total
FROM table
WHERE condition = 0
GROUP BY replace_field_name()) sq2
USING(replace_field_name())
因此,当我想要比较许多不同的字段时,只需要在一个位置而不是五个位置更改字段名称即可。
这可能吗?
答案 0 :(得分:2)
以下有关BigQuery标准SQL的想法/建议
我想将此字段名称抽象为一个临时函数...
正如蒂姆(Tim)在评论中提到的那样-完全不可能以嘲笑的方式进行
我想像这样比较许多不同的字段,我只需要在一个位置而不是五个位置更改字段名称。
您可以尝试重新编写查询,这样您就需要在较少的地方更改字段名称,例如以下示例
#standardSQL
SELECT * FROM (SELECT field1, COUNT(*) sq1_total FROM `project.dataset.table` WHERE condition = 1 GROUP BY 1) sq1
LEFT JOIN (SELECT field1, COUNT(*) sq2_total FROM `project.dataset.table` WHERE condition = 0 GROUP BY 1) sq2
USING (field1)
OR
#standardSQL
SELECT DISTINCT field1,
COUNTIF(condition = 1) OVER(PARTITION BY field1) sq1_total,
COUNTIF(condition = 0) OVER(PARTITION BY field1) sq2_total
FROM `project.dataset.table`
在上述两种查询中-替换字段名中的字段名只有“三个”(与原始查询中的5个相对)
很明显-这不能以定性的方式解决问题-只是定量地
这可能吗?
好消息-总是可以解决的-但通常需要稍微改变您的要求和期望
例如,在以下解决方案中,您只需设置一次字段名称!!!在UNNEST(['field1']) field
行
#standardSQL
SELECT DISTINCT field, value,
COUNTIF(condition = 1) OVER(PARTITION BY field, value) sq1_total,
COUNTIF(condition = 0) OVER(PARTITION BY field, value) sq2_total
FROM (
SELECT field, REGEXP_EXTRACT(x, CONCAT(r'"', field, '":"?([^",])"?')) value, condition
FROM `project.dataset.table` t,
UNNEST([TO_JSON_STRING(t)]) x,
UNNEST(['field1']) field
)
“价格”为-您将以(带有虚拟数据)的形式输出
Row field value sq1_total sq2_total
1 field1 1 1 3
2 field1 2 1 0
代替原始查询的输出
Row field1 sq1_total sq2_total
1 1 1 3
2 2 1 null
我想比较许多不同的字段,例如
上述方法中的附加值是您可以一次性比较(针对所需的多个字段),方法是将所需字段的名称添加到UNNEST(['field1']) field
列表中,如下所示:在下面的示例中
#standardSQL
SELECT DISTINCT field, value,
COUNTIF(condition = 1) OVER(PARTITION BY field, value) sq1_total,
COUNTIF(condition = 0) OVER(PARTITION BY field, value) sq2_total
FROM (
SELECT field, REGEXP_EXTRACT(x, CONCAT(r'"', field, '":"?([^",])"?')) value, condition
FROM `project.dataset.table` t,
UNNEST([TO_JSON_STRING(t)]) x,
UNNEST(['field1', 'field2']) field
)
-- ORDER BY field, value
所以结果可能看起来像
Row field value sq1_total sq2_total
1 field1 1 1 3
2 field1 2 1 0
3 field2 1 1 1
4 field2 2 0 2
5 field2 3 1 0