将旧版转换为标准SQL(像逗号一样加入)

时间:2018-09-10 18:48:09

标签: sql google-bigquery

我正在努力将此旧版SQL查询转换为标准SQL。需要转换的特殊内容包括FLATTEN,JOIN EACH,对于参数类型ARRAY,STRING,STRING的REGEXP_REPLACE函数没有匹配的签名。支持的签名:REGEXP_REPLACE(STRING,STRING,STRING); REGEXP_REPLACE(BYTES,BYTES,BYTES)等...任何人都可以帮忙吗?

谢谢!

SELECT a.name, b.name, COUNT(*) as count
FROM (FLATTEN(
SELECT GKGRECORDID, UNIQUE(REGEXP_REPLACE(SPLIT(V2Persons,';'), r',.*'," ")) name
FROM [gdelt-bq:gdeltv2.gkg] 
WHERE DATE>20180901000000 and DATE < 20180910000000 and V2Persons like '%Trump%'
,name)) a
JOIN EACH (
SELECT GKGRECORDID, UNIQUE(REGEXP_REPLACE(SPLIT(V2Persons,';'), r',.*'," ")) name
FROM [gdelt-bq:gdeltv2.gkg] 
WHERE DATE>20180901000000 and DATE < 20180910000000 and V2Persons like '%Trump%'
) b
ON a.GKGRECORDID=b.GKGRECORDID
WHERE a.name<b.name
GROUP EACH BY 1,2
ORDER BY 3 DESC
LIMIT 250

2 个答案:

答案 0 :(得分:1)

回复:展平我会在这里查阅文档:https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#removing_repetition_with_flatten

在其他示例中,文档说明: “标准SQL不像传统SQL那样具有FLATTEN函数,但是您可以使用JOIN(逗号)运算符实现类似的语义。”

回复:加入每个,这已经在这里得到回答:BigQuery - equivalent of GROUP EACH in standard SQL

基本上,在标准sql中根本没有必要

回复:“就像用逗号分隔的参数一样……”,您的语法适合标准sql。它的运行方式应与在旧版SQL中运行时的运行方式没有任何不同。标准sql的一大优点是,您可以使用WHERE语句中的函数比较列,并且比允许的旧版SQL具有更大的灵活性(如有必要)。例如,如果您想在运行类似比较之前拆分V2Person,则可以在WHERE语句中做到这一点

更新:意识到我错过了您关于数据类型不匹配的最后一个问题。在标准sql中,当您遇到这些错误时,您可能希望显式地转换所有内容。关于不同数据类型之间的比较,它比传统sql更挑剔,但我发现这与其他SQL数据库更加一致。

答案 1 :(得分:1)

SELECT a.name, b.b_name, COUNT(*) as count
FROM (
SELECT DISTINCT GKGRECORDID, REGEXP_REPLACE(name, r',.*'," ") name
FROM `gdelt-bq.gdeltv2.gkg`, UNNEST(SPLIT(V2Persons,';')) as name
WHERE DATE>20180901000000 and DATE < 20180910000000 and V2Persons like '%Trump%'
) a
JOIN (
SELECT DISTINCT GKGRECORDID, REGEXP_REPLACE(b_name, r',.*'," ") b_name
FROM `gdelt-bq.gdeltv2.gkg`, UNNEST(SPLIT(V2Persons,';')) as b_name 
WHERE DATE>20180901000000 and DATE < 20180910000000 and V2Persons like '%Trump%'
) b
ON a.GKGRECORDID=b.GKGRECORDID
WHERE a.name<b.b_name
GROUP BY 1,2
ORDER BY 3 DESC
LIMIT 250