передавать результаты между запросами и отображать совместные результаты (Google BigQuery) - PullRequest
0 голосов
/ 28 января 2020

Я хочу сделать запрос q1 и использовать результат q1 для второго запроса q2. Я хочу отобразить все столбцы q1 и q2, чтобы результаты основывались на общем столбце.

(Пожалуйста, дайте мне знать, если заголовок не так ясен)

Пример ниже должен отображать столбцы [id, publisher, author] в q1. Я хочу передать их q2, получить свойства [id, cited_id, category] для всех элементов в столбце id q1.

Как результат, для каждого id я хочу отобразить все cited_ids и их свойства (как идентификаторов, так и cited_ids).

В качестве альтернативы, для лучшей наглядности также можно получить массив cited_ids для каждого идентификатора, и в отдельном запросе я украслю свои идентификаторы и cited_ids с их свойствами.

Пожалуйста, сообщите также о "производительности" (я использую bigquery, так что если вы могли бы объяснить, почему решение более эффективно, что поможет сэкономить вычислительные ресурсы!).

Я придумал это, но не могу отобразить все столбцы q1.

WITH q1 AS (

    SELECT id, publisher, a.name
         FROM `db.publications`,
         UNNEST (publisher) as h,
         UNNEST (author) as a
         WHERE h Like '%penguin%'
)
SELECT p.id, c.id AS Cited, c.Category AS Cat 
     FROM `db.publications` AS p, UNNEST(citation) AS c 
     WHERE p.id IN (SELECT id from q1)

Пример данных:

# result of q1
Row | Id | Publisher | Author
1   | item0 | penguin | Bob
2   | item0 | penguin | Alice
3   | item1 | penguin | Charlie

Я хочу найти другие элементы, на которые ссылается каждый уникальный элемент в q1 (item0, item1).

Я могу sh получить результаты в удобном формате, который можно используется следующим образом:

# Citations: books mentioned by item0, item1 ... 
item0 : [item10, item15, item100]
item1 : [item23, item0, item101, item15]
..

# Decorators : information about each book:
Row | Id | Publisher | Author(s) |  

Мой вопрос может ли достичь как в одном запросе? Если это так, удобно или лучше разделить на два отдельных запроса для меньших вычислительных ресурсов? Мой подход - сначала запросить набор книг и их декораторов, а затем использовать список идентификаторов, чтобы найти их цитаты. Я не мог нести декораторы вместе с приведенным выше примером.

1 Ответ

1 голос
/ 28 января 2020

Что касается первой части вашего вопроса, вместо использования where p.id in(select id from q1) используйте объединение для ввода q1 полей.

WITH q1 AS (

    SELECT id, publisher, a.name
         FROM `db.publications`,
         UNNEST (publisher) as h,
         UNNEST (author) as a
         WHERE h Like '%penguin%'
),
joined as (
  select id, p.citation, q1.publisher, q1.name
  from `db.publications` p
  inner join q1 using(id)
)
select id, c.id as Cited, c.Category as Cat
from joined
left join unnest(citation) c

...