Google bigquery BigQuery请求计算已访问url的唯一卷

Google bigquery BigQuery请求计算已访问url的唯一卷,google-bigquery,intersection,Google Bigquery,Intersection,我有一个具有以下模式的BigQuery表:user_id,url。此表包含大约800M+行。 此表表示用户访问的url。 我有一个单词列表,我想提取包含这些单词的url,以及访问每个url的用户数量。 这部分没问题,我想这是一个简单的查询: SELECT url, COUNT(DISTINCT(user_id)) AS uu FROM `table` WHERE (url like '%word1%' OR url like 'word2%' OR url like '%word3%') GRO

我有一个具有以下模式的BigQuery表:user_id,url。此表包含大约800M+行。 此表表示用户访问的url。 我有一个单词列表,我想提取包含这些单词的url,以及访问每个url的用户数量。 这部分没问题,我想这是一个简单的查询:

SELECT url, COUNT(DISTINCT(user_id)) AS uu FROM `table` WHERE (url like '%word1%' OR url like 'word2%' OR url like '%word3%') GROUP BY url
(如果我想知道不同用户的总数,那么将这些数字相加是错误的,因为可能有一些用户访问了包含这些单词的多个URL。) 我想要的是,在UI中,每次用户选择/取消选择url时,能够取消选择我找到的这些url中的一些,并查看已消除重复的总剩余量。 我可以做的是获取仍然选中的剩余URL并运行此查询:

SELECT COUNT(DISTINCT(user_id)) AS uu FROM `table` WHERE (url like == url1 OR url == url2 OR url == url3)
我想这会很好,但我做不到:我不得不假设用户会多次选择/取消选择,并且每次运行此查询的成本太高。也可能 跑很长时间。
我有办法做到这一点吗?可能有一些预先计算的东西可能会有帮助,但是什么呢?

如果一方面需要精确的完全不同的用户,另一方面需要动态选择URL,我能想到的唯一优化方法就是处理一个较小的重复数据消除表。 如果您有很多重复的(user\u id,url)对,您可以使用
从表中选择不同的url,user\u id来填充中间表,然后使用它。
您可以通过规范化和缩短URL(例如,删除URL参数、小写、删除域名(如果所有URL都在同一个URL下))进一步优化

也许,根据您的用例,您可能只关心某个活动级别以上的URL,然后您可以进一步减少如下行:

WITH user_urls as (
SELECT DISTINCT
    user_id,
    url,
    count(distinct user_id) over (partition by url) as url_user_count
  FROM table
)
SELECT *
FROM user_urls
WHERE url_user_count>1000