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”永远不可能为真?对不起,我的错,应该检查数据和查询。更改了查询并添加了结果