Sql 按每个可能的组合分组

Sql 按每个可能的组合分组,sql,google-bigquery,Sql,Google Bigquery,我在BigQuery中有一个如下所示的表: 第一个字段是id,第二个字段是url。 一行表示访问URL的某人(ID)。 假设我的URL是url1、url2、url3。我想知道有多少唯一ID至少访问过以下URL元组一次: (url1) (url2) (url3) (url1, url2) (url1, url3) (url2, url3) (url1, url2, url3) 我对URL并不感兴趣,而是对URL的域感兴趣。 目前,我有一个解决方案,但仅适用于成对的域: select NET

我在BigQuery中有一个如下所示的表:

第一个字段是
id
,第二个字段是
url
。 一行表示访问URL的某人(ID)。 假设我的URL是
url1、url2、url3
。我想知道有多少唯一ID至少访问过以下URL元组一次:

(url1)
(url2)
(url3)
(url1, url2)
(url1, url3)
(url2, url3)
(url1, url2, url3)
我对URL并不感兴趣,而是对URL的域感兴趣。 目前,我有一个解决方案,但仅适用于成对的域:

select
  NET.REG_DOMAIN(d1.url) as primary_url,
  NET.REG_DOMAIN(d2.url) as linked_url,
  count(distinct id) as shared_count
from `sample` d1
inner join `sample` d2 using(id)
where NET.REG_DOMAIN(d1.url) != NET.REG_DOMAIN(d2.url)
group by 1,2
有了这个,我得到了我想要的,但只针对成对的域。 例如,我没有为
(url1、url2、url3)
获得它(假设它来自不同的域)

有办法做到这一点吗


谢谢。

如果您对URL不感兴趣,只对域感兴趣

解决方案1:

如果您希望按域计数,但需要所有URL。在传统的sql中,如果不保持元素数量的上限,它是不容易实现的(在spark中很容易实现查看spark中的collect_列表)

Sol2:(在没有spark的SQL中)


在上面的SQL中,基本上给出了与域关联的URL列。拥有所有列后,您可以创建一个列表/concat作为单个列。

如果您对URL不感兴趣,并且只对域感兴趣

解决方案1:

如果您希望按域计数,但需要所有URL。在传统的sql中,如果不保持元素数量的上限,它是不容易实现的(在spark中很容易实现查看spark中的collect_列表)

Sol2:(在没有spark的SQL中)


在上面的SQL中,基本上给出了与域关联的URL列。一旦你有了所有的列,你可以创建一个列表/目录作为一个单独的列。

嗨,谢谢你的回答,你能解释一下第一个解决方案如何涵盖我在问题中提出的所有案例吗?嗨,谢谢你的回答,你能解释一下第一个解决方案如何涵盖我在问题中提出的所有案例吗?
select NET.REG_DOMAIN(url), count(distinct id) 
from inputtable
group by 1
 select domain
    , SUM(IF(rwn=1,url,NULL)) url1
    , SUM(IF(rwn=1,url2,NULL)) url2, ... 
    (select 
         NET.REG_DOMAIN(url) as domain, url, id,  
         row_number() over(partition by NET.REG_DOMAIN(url)) as rwn
    from inputtable) a
    group by domain