无法将BigQuery旧版SQL转换为标准SQL以保持左移(...)

时间:2019-06-29 16:47:40

标签: google-bigquery standard-sql

我想对BigQuery Standard SQL之类的查询使用this one

SELECT package, COUNT(*) count
FROM (
  SELECT REGEXP_EXTRACT(line, r' ([a-z0-9\._]*)\.') package, id
  FROM (
    SELECT SPLIT(content, '\n') line, id
    FROM [github-groovy-files:github.contents] 
    WHERE content CONTAINS 'import'
    HAVING LEFT(line, 6)='import' )
    GROUP BY package, id
  )
GROUP BY 1
ORDER BY count DESC
LIMIT 30;

我无法越过类似的东西(可以,但是不能使用GROUP或COUNT):

with lines as 
(SELECT SPLIT(c.content, '\n') line, c.id as id
      FROM `<dataset>.contents` c, `<dataset>.files` f 
      WHERE c.id = f.id AND f.path LIKE '%.groovy')
select 
  array(select REGEXP_REPLACE(l, r'import |;', '') AS class from unnest(line) as l where l like 'import %') imports, id
from lines;

LEFT()不在Standard SQL中,并且似乎没有一个可以接受数组类型的函数。

1 个答案:

答案 0 :(得分:3)

  

LEFT()不在标准SQL中...

在BigQuery Standard SQL中,您可以使用SUBSTR(value, position[, length])代替旧版的LEFT

  

...并且似乎没有一个可以接受数组类型的函数。

有很多Array's related functions以及接受数组作为参数的函数-例如UNNEST()

  

我想对这种查询使用BigQuery Standard SQL:

以下是BigQuery标准SQL的等效查询

SELECT package, COUNT(*) COUNT
FROM (
  SELECT REGEXP_EXTRACT(line, r' ([a-z0-9\._]*)\.') package, id
  FROM (
    SELECT line, id
    FROM `github-groovy-files.github.contents`,
    UNNEST(SPLIT(content, '\n')) line
    WHERE SUBSTR(line, 1, 6)='import' 
  )
  GROUP BY package, id
)
GROUP BY 1
ORDER BY COUNT DESC
LIMIT 30

您可以使用WHERE SUBSTR(line, 1, 6)='import'代替WHERE line LIKE 'import%'

还请注意,此查询可以用多种方式编写-因此,在上面的示例中,我着重于将查询“从旧版”转换为标准sql,同时保留了原始查询的核心结构和方法

但是,如果您想使用Standard SQL的功能重写它-您将得到下面的类似内容

SELECT REGEXP_EXTRACT(line, r' ([a-z0-9\._]*)\.') package, COUNT(DISTINCT id) count
FROM `github-groovy-files.github.contents`,
UNNEST(SPLIT(content, '\n')) line
WHERE line LIKE 'import%' 
GROUP BY 1
ORDER BY count DESC
LIMIT 30