Повторяющиеся имена столбцов в BigQuery при двойном выборе в одной и той же таблице - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь выполнить следующий запрос в BigQuery:

SELECT * FROM
  (
    SELECT
      date,
      grob as `grob_r1`
    FROM `mytab_tbl`
    WHERE region = "r1"
  )
  AS TAB_1,
  (
    SELECT
      date,
      grob as `grob_r2`
    FROM `mytab_tbl`
    WHERE region = "r2"
  )
  AS TAB_2
WHERE TAB_1.date = TAB_2.date

В основном это выборка в одной и той же таблице с применением различных правил условий с целью создания представления. Однако я получаю следующую ошибку: Duplicate column names in the result are not supported. Found duplicate(s): date

Есть ли у вас какие-либо идеи о том, как это исправить?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Во-первых, научитесь использовать правильный синтаксис JOIN.

Затем BigQuery позволяет выбрать полные записи. Обычно я рекомендую такой подход:

SELECT TAB_1, TAB_2
FROM (SELECT date, grob as grob_r1
      FROM `mytab_tbl`
      WHERE region = 'r1'
     ) TAB_1 JOIN
     (SELECT date, grob as grob_r2
      FROM `mytab_tbl`
      WHERE region = 'r2'
     ) TAB_2
     ON TAB_1.date = TAB_2.date;

В этом случае вам, вероятно, не нужно DATE дважды. BigQuery поддерживает стандартное предложение USING, которое позволяет вам:

SELECT *
FROM (SELECT date, grob as grob_r1
      FROM `mytab_tbl`
      WHERE region = 'r1'
     ) TAB_1 JOIN
     (SELECT date, grob as grob_r2
      FROM `mytab_tbl`
      WHERE region = 'r2'
     ) TAB_2
     USING (date);

Это возвращает три столбца.

Еще одна удобная альтернатива, которая в данном случае не нужна, это EXCEPT:

SELECT TAB_1.*,
       TAB_2.* EXCEPT (date)
FROM (SELECT date, grob as grob_r1
      FROM `mytab_tbl`
      WHERE region = 'r1'
     ) TAB_1 JOIN
     (SELECT date, grob as grob_r2
      FROM `mytab_tbl`
      WHERE region = 'r2'
     ) TAB_2
     ON TAB_1.date = TAB_2.date;
1 голос
/ 19 апреля 2020

Как правило, ваш SELECT * просто получит все столбцы из TAB_1 и TAB_2, и в обоих случаях у вас есть поле даты.

SELECT TAB_1.*, TAB_2.grob_r2 FROM
  (
    SELECT
      date,
      grob as `grob_r1`
    FROM `mytab_tbl`
    WHERE region = "r1"
  )
  AS TAB_1,
  (
    SELECT
      date,
      grob as `grob_r2`
    FROM `mytab_tbl`
    WHERE region = "r2"
  )
  AS TAB_2
WHERE TAB_1.date = TAB_2.date

В вашем случае ваше условие соединения является равенством, но если вы хотите получить дату из TAB_2 также и в своих результатах, или если вы хотите получить все столбцы из TAB_2, какими бы они ни были , вы можете сделать что-то вроде

SELECT TAB_1.*, TAB_2.* EXCEPT(date), TAB_2.date AS tab_2_date FROM ...

edit: чтобы помочь вам с вопросом FULL JOIN.

SELECT TAB_1.*, TAB_2.grob_r2 FROM
  (
    SELECT
      date,
      grob as `grob_r1`
    FROM `mytab_tbl`
    WHERE region = "r1"
  )
  AS TAB_1 FULL JOIN 
  (
    SELECT
      date,
      grob as `grob_r2`
    FROM `mytab_tbl`
    WHERE region = "r2"
  )
  AS TAB_2
ON TAB_1.date = TAB_2.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...