认为这是一个非常基本的查询,但是我无法使其正常工作。 尚未找到解决方案。
我有两个数据不同的表。这两个表都包含一个ID作为字符串,称为clientID。
表 A 具有所有Google Analytics(分析)会话的ID,不同的事件和自定义维度。
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。 因此,我想在表 A 中匹配/搜索表 B 中的clientID。 我只想要ID相匹配的表A中的数据。
我在这里使用标准SQL。关于如何解决这个问题的任何想法? 认为我必须在这里使用JOIN,但是对此没有经验。
答案 0 :(得分:0)
使用IN子句,这应该非常简单(经测试,bigquery支持IN。)
#!/bin/sh
## "safely" create a temporary configuration file
curlctl=$(mktemp -q -t $(basename "$0"))
if test $? -ne 0
then
echo "$0: failed to create temporary file, exiting."
exit 75 # EX_TEMPFAIL
fi
trap 'rm "$curlctl"' 0
## write parameters used in all cases
cat>>"$curlctl" <<EOF
output = /dev/null
silent
write-out = %{http_code}
EOF
## append conditional parameters
if test "$some" = 'condition'
then
printf 'header = "Authorization: Bearer %s"\n' "$JWT" >> "$curlctl"
else
echo "cert = $ADMIN_CERT_PATH" >> "$curlctl"
echo "key = $ADMIN_KEY_PATH" >> "$curlctl"
fi
# uncomment to see what the config file looks like
# cat "$curlctl" | sed 's/^/curl config: /'
response_code=$(curl --config "$curlctl" http://httpbin.org/get)
echo "response code: $response_code"
答案 1 :(得分:0)
如您所建议,加入将帮助您实现目标。
让我以下面的表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 |
+----------+
现在,您可以在BigQuery中使用JOIN操作,以便仅从 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_*
上JOIN,或者从此查询中获取结果,然后在clientId
上进行JOIN。
鉴于您已开始在BigQuery中使用JOIN,请允许我与您分享一些可能也有用的文档链接: