Преобразование Legacy в стандартный SQL (объединение и запятая) - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь преобразовать этот устаревший SQL-запрос в стандартный SQL.Конкретными вещами, которые необходимо преобразовать, являются FLATTEN, JOIN EACH, нет соответствующей сигнатуры для функции REGEXP_REPLACE для типов аргументов: ARRAY, STRING, STRING.Поддерживаемые подписи: REGEXP_REPLACE (STRING, STRING, STRING);REGEXP_REPLACE (БАЙТЫ, БАЙТЫ, БАЙТЫ) и т. Д. ... Кто-нибудь может помочь, пожалуйста?

Спасибо!

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 голосов
/ 10 сентября 2018
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
0 голосов
/ 10 сентября 2018

Re: сглаживание Я бы ознакомился с документацией здесь: https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#removing_repetition_with_flatten

Среди прочих примеров в документации отмечены: «Стандартный SQL не имеет функции FLATTEN, как в устаревшем SQL, но вы можете добиться аналогичной семантики с помощью оператора JOIN (запятая).»

Re: Присоединиться к каждому, здесь ответили: BigQuery - эквивалент GROUP EACH в стандартном SQL

В принципе, в стандартном sql

он вообще не нужен

Re: «НРАВИТСЯ с параметрами, разделенными запятыми ...», ваш синтаксис подходит для стандартного sql. он не должен работать иначе, чем при старте в sql. Одним из больших плюсов стандартного sql является то, что вы можете сравнивать столбцы, используя функции в выражении WHERE, с большей гибкостью, чем допустимый унаследованный SQL (при необходимости). Например, если вы хотите разделить V2Persons перед выполнением аналогичного сравнения, вы можете сделать это прямо в операторе WHERE

ОБНОВЛЕНИЕ: Понимая, что я пропустил ваш последний вопрос о несоответствиях типов данных. В стандартном SQL вы, вероятно, захотите привести все явно, когда столкнетесь с этими ошибками. Это более привередливый, чем унаследованный sql, в отношении сравнений между различными типами данных, но я считаю, что это больше соответствует другим базам данных SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...