Невозможно перевести устаревший SQL BigQuery в стандартный SQL для HAVING LEFT (...) - PullRequest
0 голосов
/ 29 июня 2019

Я хотел бы использовать BigQuery Standard SQL для запроса типа этот :

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;

Я не могу преодолеть что-то подобное (работает, но не группирует и не подсчитывает):

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() отсутствует в стандартном SQL, и, похоже, нет функции, которая будет принимать и тип массива.

1 Ответ

3 голосов
/ 29 июня 2019

LEFT () не в стандартном SQL ...

В BigQuery Standard SQL вы можете использовать SUBSTR(value, position[, length]) вместо Legacy's LEFT

... и, похоже, нет функции, которая будет принимать и тип массива.

Существует множество связанных с массивом функций , а также функций, которые принимают массив в качестве аргумента - например, UNNEST ()

Я бы хотел использовать BigQuery Standard SQL для такого запроса:

Ниже приведен эквивалентный запрос для BigQuery Standard 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, сохраняя при этом базовую структуру и подход оригинала.query

Но если вы захотите переписать его, используя возможности стандартного 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
...