Сравните два идентификатора / строки в BigQuery
Думаю, это довольно простой запрос, но я просто не могу заставить его работать. Решений пока не найдено.
У меня есть две таблицы с разными данными. Обе таблицы содержат идентификатор в виде строки, называемой clientID.
Таблица A имеет идентификатор, а также различные события и пользовательские измерения из всех сеансов Google Analytics.
SELECT
clientId,
visitNumber,
hits.page.pagePath AS pagePath,
trafficSource.source AS source,
--Events
SUM(CASE WHEN (hits.eventInfo.eventCategory = 'Download' AND hits.type =
'EVENT' AND hits.eventInfo.eventAction = 'pdf') THEN 1 ELSE 0 END) AS
Downloads,
SUM(CASE WHEN (hits.eventInfo.eventLabel = 'search-header' OR
hits.eventInfo.eventLabel = 'search-mainpage') AND hits.type = 'EVENT' THEN
1 ELSE 0 END) AS Search,
--CustomDimension
(SELECT MAX(cd.value) FROM UNNEST(hits.customDimensions) AS cd WHERE
cd.index = 1) AS realURL
FROM `xxxx.xxxx.ga_sessions_*` AS t, UNNEST(hits) AS hits
WHERE
hits.page.pagePath LIKE 'news-and-media' AND _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', date '2018-05-31') AND FORMAT_DATE('%Y%m%d', date
'2018-10-01')
GROUP BY
clientId,
visitNumber,
pagePath,
source,
realURL
LIMIT 100;
Таблица B имеет только один столбец с некоторыми clientID. Поэтому я хочу сопоставить / найти clientIDs в таблице A для clientIDs, которые находятся в таблице B. Я хочу только данные из таблицы А, где идентификаторы совпадают.
Я использую Стандартный SQL здесь. Есть мысли о том, как решить эту проблему? Думаю, я должен использовать JOIN здесь, но не имеет опыта с этим.
2 ответа
Как вы предложили, JOIN поможет вам достичь вашей цели.
Позвольте мне использовать таблицы tableA
а также tableB
ниже для примера:
$ bq query --use_legacy_sql=false 'SELECT * FROM `dataset.tableA`'
+----------+------------+-----------+
| clientID | clientName | clientNum |
+----------+------------+-----------+
| id1 | aaa | 111 |
| id1 | bbb | 222 |
| id2 | ccc | 333 |
| id3 | ddd | 444 |
| id4 | eee | 555 |
| id5 | fff | 666 |
+----------+------------+-----------+
$ bq query --use_legacy_sql=false 'SELECT * FROM `dataset.tableB`'
+----------+
| clientID |
+----------+
| id1 |
| id4 |
| id5 |
+----------+
Теперь вы можете использовать операцию JOIN в BigQuery для извлечения только строк из tableA
где колонна clientID
соответствует этим значениям в том же столбце в tableB
:
SELECT
tA.clientID,
tA.clientName,
tA.clientNum
FROM
`dataset.tableA` AS tA
JOIN
`dataset.tableB` AS tB
ON
tA.clientID = tB.clientID
Этот запрос предоставляет следующие результаты:
$ bq query --use_legacy_sql=false 'SELECT tA.clientID, tA.clientName, tA.clientNum FROM `dataset.tableA` AS tA JOIN `dataset.tableB` AS tB ON tA.clientID = tB.clientID'
+----------+------------+-----------+
| clientID | clientName | clientNum |
+----------+------------+-----------+
| id1 | aaa | 111 |
| id1 | bbb | 222 |
| id4 | eee | 555 |
| id5 | fff | 666 |
+----------+------------+-----------+
В вашем случае вы можете присоединиться к clientId
после извлечения из xxxx.xxxx.ga_sessions_*
или получить результаты этого запроса, а затем присоединиться к ним в clientId
,
Учитывая, что вы начинаете работать с JOIN в BigQuery, позвольте мне поделиться с вами несколькими ссылками на документацию, которые также могут быть полезны:
Это должно быть очень просто, используя предложение IN (только что протестировано, IN поддерживается в bigquery).
select * from tableA where ID in (select ID from tableB)