【问题标题】:Convert Legacy to Standard SQL (Join Each and comma Like)将旧版 SQL 转换为标准 SQL(加入每个和逗号)
【发布时间】:2018-09-10 18:48:08
【问题描述】:

我正在努力将此旧版 SQL 查询转换为标准 SQL。需要转换的特定内容是 FLATTEN、JOIN EACH、对于参数类型的函数 REGEXP_REPLACE 没有匹配签名:ARRAY、STRING、STRING。支持的签名: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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

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

      Re: Join Each,这里已经回答了这个问题:BigQuery - equivalent of GROUP EACH in standard SQL

      在标准sql中基本不需要

      Re:“LIKE 具有逗号分隔的参数...”,您的语法适用于标准 sql。它的运行方式不应与您在旧版 sql 中运行时的运行方式有任何不同。标准 sql 的一大优点是,您可以使用 WHERE 语句中的函数比较列,其灵活性比允许的传统 SQL 更大(如有必要)。例如,如果您想在运行类似比较之前拆分 V2Person,您可以在 WHERE 语句中执行此操作

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

      【讨论】:

        猜你喜欢
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多