比较BigQuery中的两个ID /字符串

时间:2018-12-11 11:40:16

标签: sql google-analytics google-bigquery standard-sql

认为这是一个非常基本的查询,但是我无法使其正常工作。 尚未找到解决方案。

我有两个数据不同的表。这两个表都包含一个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,但是对此没有经验。

2 个答案:

答案 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)

如您所建议,加入将帮助您实现目标。

让我以下面的表tableAtableB为例:

$ 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,请允许我与您分享一些可能也有用的文档链接:

相关问题