Mysql 从SQL表创建键值对
我最近遇到了一个问题,我在一个专栏中列出了许多网站的名称(重复),我必须找出以http和https形式存在的域(例如:和)。我的质询是—Mysql 从SQL表创建键值对,mysql,google-bigquery,Mysql,Google Bigquery,我最近遇到了一个问题,我在一个专栏中列出了许多网站的名称(重复),我必须找出以http和https形式存在的域(例如:和)。我的质询是— `SELECT distinct SPLIT(origin,"://")[OFFSET(1)] as domain FROM "chrome-ux-report.chrome_ux_report.201710" x WHERE SPLIT(x.origin,"://")[OFFSET(0)] = "http" and SPLIT(
`SELECT distinct SPLIT(origin,"://")[OFFSET(1)] as domain
FROM "chrome-ux-report.chrome_ux_report.201710" x
WHERE SPLIT(x.origin,"://")[OFFSET(0)] = "http"
and SPLIT(x.origin,"://")[OFFSET(1)] in
(SELECT SPLIT(y.origin,"://")[OFFSET(1)]
FROM "chrome-ux-report.chrome_ux_report.201710" y
WHERE SPLIT(y.origin,"://")[OFFSET(0)] = "https" )
ORDER BY domain`
此查询需要O(n^2)个时间。了解python之后,我不禁想到了一个解决方案,在这个解决方案中,我可以构建一个新表,其中域作为键,http和https作为值,例如dict['www.google.com']=[1,1]或sql-
Domain http https
www.google.com 1 1
这需要O(n)时间。你知道我该怎么做吗?提前谢谢 使用公共表表达式预先选择数据应该可以减少很多O(n^2)。不是O(n),而是更接近
WITH cte AS (
SELECT DISTINCT origin
FROM "chrome-ux-report.chrome_ux_report.201710" x
WHERE SPLIT(x.origin,"://")[OFFSET(0)] IN ("http", "https")
)
SELECT DISTINCT SPLIT(origin,"://")[OFFSET(1)] AS domain
FROM cte
WHERE SPLIT(cte.origin,"://")[OFFSET(0)] = "http"
AND SPLIT(cte.origin,"://")[OFFSET(1)] IN (
SELECT SPLIT(cte2.origin,"://")[OFFSET(1)]
FROM cte AS cte2
WHERE SPLIT(cte2.origin,"://")[OFFSET(0)] = "https"
)
ORDER BY domain
使用公共表表达式预先选择数据会减少很多O(n^2)。不是O(n),而是更接近
WITH cte AS (
SELECT DISTINCT origin
FROM "chrome-ux-report.chrome_ux_report.201710" x
WHERE SPLIT(x.origin,"://")[OFFSET(0)] IN ("http", "https")
)
SELECT DISTINCT SPLIT(origin,"://")[OFFSET(1)] AS domain
FROM cte
WHERE SPLIT(cte.origin,"://")[OFFSET(0)] = "http"
AND SPLIT(cte.origin,"://")[OFFSET(1)] IN (
SELECT SPLIT(cte2.origin,"://")[OFFSET(1)]
FROM cte AS cte2
WHERE SPLIT(cte2.origin,"://")[OFFSET(0)] = "https"
)
ORDER BY domain
像这样的怎么样?这样子查询之间几乎没有那么多相关性
Select sum(if(origin like 'http://%', 1,0 ) as http,
sum(if(origin like 'https://%', 1,0 ) as https,
Replace(Replace (origin,'http://',''),'https://','') as domain
Group by domain
假设你真的想要MySQL,这似乎有问题。像这样的东西怎么样?这样子查询之间几乎没有那么多相关性
Select sum(if(origin like 'http://%', 1,0 ) as http,
sum(if(origin like 'https://%', 1,0 ) as https,
Replace(Replace (origin,'http://',''),'https://','') as domain
Group by domain
假设你真的想要MySQL,这似乎有问题。嗯,这是一个有趣的问题;我就扔我的2美分。下面是我在BigQuery中解决这个问题的方法:
WITH data AS(
SELECT 'http://google.com.br' AS origin UNION ALL
SELECT 'https://google.com.br' AS origin UNION ALL
SELECT 'https://www.google.com.br' UNION ALL
SELECT 'http://domain1' UNION ALL
SELECT 'https://domain2'
)
SELECT
REGEXP_EXTRACT(origin, r'://(.*)') AS domain,
MAX(IF(REGEXP_CONTAINS(origin, r'^http[^s]'), TRUE, FALSE)) http,
MAX(IF(REGEXP_CONTAINS(origin, r'^https'), TRUE, FALSE)) https
FROM data
GROUP BY 1
结果:
Row domain http https
1 www.google.com.br false true
2 domain2 false true
3 google.com.br true true
4 domain1 true false
我认为这个查询的BigO比n^2
低,但可能比n
大:在MySQL中,一个索引列AFAIK可以在log(n)
中进行行查找(假设是b-索引树),当这在这个查询中发生n
次时,最终结果是nlog(n)
(也许可以使用哈希映射来达到O(n)
,但我不知道最终结果是否是n
)
另一方面,BigQuery没有索引;它确实有不同的数据管理策略,正如你在这篇文章中看到的(惊人的阅读)
尽管如此,对于这个任务,我想BigQuery可能无法达到
O(n)
。Hmm这是一个有趣的问题;我就扔我的2美分。下面是我在BigQuery中解决这个问题的方法:
WITH data AS(
SELECT 'http://google.com.br' AS origin UNION ALL
SELECT 'https://google.com.br' AS origin UNION ALL
SELECT 'https://www.google.com.br' UNION ALL
SELECT 'http://domain1' UNION ALL
SELECT 'https://domain2'
)
SELECT
REGEXP_EXTRACT(origin, r'://(.*)') AS domain,
MAX(IF(REGEXP_CONTAINS(origin, r'^http[^s]'), TRUE, FALSE)) http,
MAX(IF(REGEXP_CONTAINS(origin, r'^https'), TRUE, FALSE)) https
FROM data
GROUP BY 1
结果:
Row domain http https
1 www.google.com.br false true
2 domain2 false true
3 google.com.br true true
4 domain1 true false
我认为这个查询的BigO比n^2
低,但可能比n
大:在MySQL中,一个索引列AFAIK可以在log(n)
中进行行查找(假设是b-索引树),当这在这个查询中发生n
次时,最终结果是nlog(n)
(也许可以使用哈希映射来达到O(n)
,但我不知道最终结果是否是n
)
另一方面,BigQuery没有索引;它确实有不同的数据管理策略,正如你在这篇文章中看到的(惊人的阅读)
尽管如此,对于这个任务,我想BigQuery可能无法到达
O(n)
。问题是找到所有以https和http形式存在的域。我从python中获得了字典的概念。(现在我看到它是多余的)你是在MySQL还是BigQuery中工作?您已经标记了这两个。问题是要查找所有以https和http形式存在的域。我从python中获得了字典的概念。(现在我看到它是多余的)你是在MySQL还是BigQuery中工作?你的查询输出的域中只有http版本。(在o/p表中,http列全部为true,https列全部为false)奇怪…不知道为什么会发生这种情况。我模拟的数据看起来也和你的一样。如果使用模拟数据运行此查询,您会得到正确的结果?您的查询会输出仅存在http版本的域。(在o/p表中,http列全部为true,https列全部为false)奇怪…不知道为什么会发生这种情况。我模拟的数据看起来也和你的一样。如果使用模拟数据运行此查询,您会得到正确的结果吗?