相互关注SQL写法(5种不同类型写法)

背景

群友字节面试让写出3种方法,但只写出2种最后面试没过,相互关注是常见一道SQL题,但这次我们加一下挑战难度,通过不同sql方法去解(不考虑时效),且之前用过的方法后续不会再用,比较考察SQL的基本功。

题目

现在有一张表为fans(粉丝表) 里面有两个字段from_user,to_user ,如果两者一致代表from_user关注了to_user

数据

with fans as (
SELECT 
    '001' as from_user,'002' as to_user
union all 
SELECT 
    '002' as from_user,'001' as to_user
union all 
SELECT 
    '003' as from_user,'001' as to_user
union all 
SELECT 
    '005' as from_user,'001' as to_user
)

解法1:关联(scan2次)

select t1.from_user
from fans t1 
 join 
fans t2 
on t1.from_user=t2.to_user 
and t1.to_user=t2.from_user
;

from_user

001

002

解法2:关联(scan2次)

select u1 from 
(
select from_user u1,to_user u2 from fans 
union all 
select to_user u1,from_user u2 from fans 
) a 
group by u1,u2 having count(1)=2
;

U1

001

002

解法3:开窗(scan1次),最优,要的就是这个答案

select from_user
from
(
select
from_user,
if(count(fans_user) over (partition by fans_user) > 1, 1,0) as is_fans
from 
(
select if(hash(from_user)>hash(to_user),concat(from_user,'-',to_user),concat(to_user,'-',from_user)) fans_user
      ,from_user
from fans
) 
)
where is_fans=1
;

from_user

001

002

解法4:炸裂(posexplode),用index去匹配,问题在于数据量级膨胀

select count(*)
      ,fans2
      ,fans1
from (
SELECT 
    t1.fans1 ,
    t2.fans2 
FROM (
    SELECT 
        CONCAT(from_user,'-',to_user) AS fan1,
        CONCAT(to_user,'-',from_user) AS fan2,
        from_user
    FROM fans
) as temp_table
LATERAL VIEW posexplode(split(temp_table.fan1,'-')) t1 AS fans_index1,fans1
LATERAL VIEW posexplode(split(temp_table.fan2,'-')) t2 AS fans_index2,fans2
WHERE t1.fans_index1 = t2.fans_index2
)
group by fans2
        ,fans1
having count(*)=2

cnt

fans2

fans1

2

002

001

2

001

002

解法5:集合排序(sort_array),通过拼接collect_list形成list,再去切割排序

SELECT count(sort_array(split(user_fans,'-'))) as cnt
      ,sort_array(split(user_fans,'-')) as fans_list
from (
SELECT concat_ws(',',COLLECT_LIST(concat(from_user,'-',to_user))) as user_fans
      ,from_user
FROM fans
group by from_user
) GROUP BY sort_array(split(user_fans,'-'))
having count(sort_array(split(user_fans,'-')))=2

cnt

fans_list

2

[001,002]

#sql练习日常##数据人的面试交流地##24届软开秋招面试经验大赏##牛客创作赏金赛##数据分析#
全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q了:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务