BigQuery-从临时函数的结果中填充SELECT字段

时间:2019-07-03 04:58:33

标签: google-bigquery

在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())

因此,当我想要比较许多不同的字段时,只需要在一个位置而不是五个位置更改字段名称即可。

这可能吗?

1 个答案:

答案 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