Sql 配置单元:如何比较组成员资格

Sql 配置单元:如何比较组成员资格,sql,hive,Sql,Hive,我有一个表,其中包含属于某个组的所有用户的列表。每个用户都与组中的部分或所有用户共享了一张照片。有时,用户还可以与组外的用户共享照片 table1 group_id mem_id shared_mem_id 123 90001 90001 123 90001 90002 123 90001 90003 123 90002 90001 123 90002 90002 123

我有一个表,其中包含属于某个组的所有用户的列表。每个用户都与组中的部分或所有用户共享了一张照片。有时,用户还可以与组外的用户共享照片

table1

group_id   mem_id   shared_mem_id
123        90001    90001
123        90001    90002
123        90001    90003
123        90002    90001
123        90002    90002
123        90003    90002
123        90003    90003
table2

group_id   mem_id 
123        90001    
123        90002    
123        90003    
我还有一张桌子,上面有小组的花名册

table1

group_id   mem_id   shared_mem_id
123        90001    90001
123        90001    90002
123        90001    90003
123        90002    90001
123        90002    90002
123        90003    90002
123        90003    90003
table2

group_id   mem_id 
123        90001    
123        90002    
123        90003    
我想检查每个用户是与整个组共享还是与部分组共享?在蜂箱中最有效的方法是什么

最初,我尝试使用完全外部联接,如下所示,但它不起作用,因为只有当mem_id也存在于表1的shared_mem_id中时,它才追加表2中的行

select
a.*, 
b.mem_id 

from table1 
full outer join table2 on a.group_id = b.group_id and a.shared_member_id = b.mem_id
然后我完成了一个collect_集合,将所有共享的_mem_id和mem_id放在同一行中,并进行比较。对于一个简单的问题来说,这似乎需要做很多工作

预期产出:

group_id   mem_id    share_status
123        90001     1
123        90002     0
123        90003     0
有没有人有更好的方法来编写查询以更快地得到答案?谢谢大家!

你可以在下面试试

select group_id,mem_id,case when 
    count(distinct shared_mem_id)=(select count(distinct mem_id) from table2 b where a.group_id=b.group_id) then 1 else 0 end as share_status
from table1 a
group by group_id,mem_id
质疑-

select a1.group_id, a1.mem_id, min(case when b1.shared_mem_id is null then 0 else 1 end) from (select distinct a.group_id, a.mem_id, b.mem_id as shared_mem_id from test_so_t1 a, test_so_t2 b) a1 left outer join test_so_t1 b1 on a1.group_id=b1.group_id and a1.mem_id=b1.mem_id and a1.shared_mem_id=b1.shared_mem_id group by a1.group_id, a1.mem_id;
结果

Total MapReduce CPU Time Spent: 30 seconds 590 msec
OK
123     90001   1
123     90002   0
123     90003   0

您期望的输出是什么?我对输出的具体格式持开放态度,但我想告诉您,对于每个mem_id,他们是和组中的每个人共享还是只是组中的一部分。因此,也许1或0就足够了。如果您为预期的输出添加一个表格式就太好了。mem_id 90001有一个1,因为他们与组中的每个人共享感谢。只有当共享用户的数量恰好与组中的用户数量匹配时,此选项才起作用。有可能是与不在组中的人共享的,并且计数将匹配。这就是为什么我想比较确切的mem_id。我问的有意义吗?我认为中间连接将返回null,因为在该连接中“b.mem_is null”永远不可能为真?对不起,我的错,应该检查数据和查询。更改了查询并添加了结果