我最近遇到了一个问题,我在一个专栏中列出了许多网站的名称(有重复),我必须找出以http和https形式存在的域(例如:https://www.google.com and http://www.google.com). 我的问题是-
`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
你知道我怎么做吗?提前谢谢。
3条答案
按热度按时间ezykj2lf1#
使用公共表表达式来预选数据会减少很多o(n^2)。不是o(n),而是更接近。
nukf8bse2#
像这样的怎么样?这样子查询之间就没有那么多相关性了。
假设你真的想要mysql,这似乎有问题。
ssgvzors3#
嗯,这是个有趣的问题;我就扔我的2美分。下面是我在bigquery中解决这个问题的方法:
结果:
我想这个查询的bigo比
n^2
但它可能比n
:在mysql中,索引列afaik可以在log(n)
(假设b-索引树)当这发生时n
所以最终结果是nlog(n)
.(也许可以使用哈希Map
O(n)
但我不知道最终结果会是什么n
)另一方面,bigquery没有索引;正如你在这篇文章(惊人的阅读)中看到的,它确实有不同的数据管理策略。
尽管如此,bigquery可能无法访问
O(n)
我想是为了这个任务。