BQ 使用 CONTAINS 条件给出不完整的结果
BQ giving incomplete results using CONTAINS condition
我正在使用 Bigquery 处理一些 Adwords 数据,更准确地说,是从我们的目标 URL 中提取所有 url 参数,以便我们更好地组织它等等。
我编写了以下查询,以返回 table 中 "DestinationURL" 字段中可用的所有参数。如下:
SELECT Parameter
FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
FROM (SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
FROM [adwords_accounts_ads.ads_all]
HAVING Params CONTAINS '='))
GROUP BY 1
运行这将给我 6 个参数。这是正确的但不完整,因为在这个测试中 table 我知道 URL 中还有 2 个其他参数没有被获取。一个叫 'group',另一个叫 'utm_content'。
现在如果我运行:
SELECT Parameter
FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
FROM (SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
FROM [adwords_accounts_ads.ads_all]
HAVING Params CONTAINS 'p='))
GROUP BY 1
我得到 "group" 参数显示。
问题是:
不应该
"CONTAINS '='"
条件包括
"CONTAINS 'p='"
结果呢? 't=' 而不是 '='
也会发生同样的情况
有谁知道我该如何解决这个问题?甚至如何从包含 URL?
的字符串中提取所有参数
ps:使用 LIKE 产生完全相同的结果
谢谢!
Split 会创建一个 REPEATED 输出类型,您必须 FLATTEN table 才能正确查看。
这里我在 params
上使用了展平,现在输出很好:
SELECT nth(1,SPLIT(Params,'=')) AS Param,
nth(2,SPLIT(Params,'=')) AS Value
FROM flatten(SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) AS baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') AS Params
FROM
(SELECT 1 AS AdID,'http://www.example.com.br/?h=Passagens+Aereas&source=google&vt=0' AS DestinationURL)
HAVING Params CONTAINS '=',
params
)
输出:
+-----+--------+------------------+---+
| Row | Param | Value | |
+-----+--------+------------------+---+
| 1 | h | Passagens+Aereas | |
| 2 | source | google | |
| 3 | vt | 0 | |
+-----+--------+------------------+---+
注意:Web UI 总是使你的结果变平,但如果你 select 一个目的地 table 并取消选中 "flatten results",你将得到一个重复的单行部件列。
我正在使用 Bigquery 处理一些 Adwords 数据,更准确地说,是从我们的目标 URL 中提取所有 url 参数,以便我们更好地组织它等等。
我编写了以下查询,以返回 table 中 "DestinationURL" 字段中可用的所有参数。如下:
SELECT Parameter
FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
FROM (SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
FROM [adwords_accounts_ads.ads_all]
HAVING Params CONTAINS '='))
GROUP BY 1
运行这将给我 6 个参数。这是正确的但不完整,因为在这个测试中 table 我知道 URL 中还有 2 个其他参数没有被获取。一个叫 'group',另一个叫 'utm_content'。
现在如果我运行:
SELECT Parameter
FROM (SELECT NTH(1, SPLIT(Params,'=')) as Parameter,
FROM (SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) as baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') as Params
FROM [adwords_accounts_ads.ads_all]
HAVING Params CONTAINS 'p='))
GROUP BY 1
我得到 "group" 参数显示。
问题是:
不应该"CONTAINS '='"
条件包括
"CONTAINS 'p='"
结果呢? 't=' 而不是 '='
也会发生同样的情况有谁知道我该如何解决这个问题?甚至如何从包含 URL?
的字符串中提取所有参数ps:使用 LIKE 产生完全相同的结果
谢谢!
Split 会创建一个 REPEATED 输出类型,您必须 FLATTEN table 才能正确查看。
这里我在 params
上使用了展平,现在输出很好:
SELECT nth(1,SPLIT(Params,'=')) AS Param,
nth(2,SPLIT(Params,'=')) AS Value
FROM flatten(SELECT
AdID,
NTH(1, SPLIT(DestinationURL,'?')) AS baseurl,
split(NTH(2, SPLIT(DestinationURL,'?')),'&') AS Params
FROM
(SELECT 1 AS AdID,'http://www.example.com.br/?h=Passagens+Aereas&source=google&vt=0' AS DestinationURL)
HAVING Params CONTAINS '=',
params
)
输出:
+-----+--------+------------------+---+
| Row | Param | Value | |
+-----+--------+------------------+---+
| 1 | h | Passagens+Aereas | |
| 2 | source | google | |
| 3 | vt | 0 | |
+-----+--------+------------------+---+
注意:Web UI 总是使你的结果变平,但如果你 select 一个目的地 table 并取消选中 "flatten results",你将得到一个重复的单行部件列。