【解答】sql和其他语言的思考方式

上次的题目( https://blog.csdn.net/zzzqqq111222/article/details/88081647) 大家都看了吗,感觉是不是贼简单,竟然做这种题,简直侮辱智商,不介意的话我来说下大家心里是不是这样解答的?。

一、python的解答方式

1.1 数据的存在方式

python等程序语言呢我们会习惯于将数据加载到我们熟悉的数据结构中进行处理,那这里呢就是一个list ,类似于data=[['00001','00002'],……]。

1.2 数据的处理方式

python这样的程序语言范式提供给我们的思考方式也就顺序、选择、循环这三种程序结构和各种能简化操作的数据结构。

面对上面list这样一个数据结构,我们要完成我们的题目,首先想到的解决方案就是,循环遍历data,对于每一条数据(例如:['00001','00002'])我们在去data中寻找有没有与之对应的数据(['00002','00001']),如果有结果就加一。

res = 0 
for d in data:
    if [d[1],d[0]] in data:
        res += 1
return res/2

二、sql的解答方式

2.1 数据的存在方式

在写sql语言的时候我们不用关心,数据具体是在哪儿,怎么存。我们面对的是一个抽象的对象:表,它就代表了数据的存在。

2.2 数据的处理方式

在sql语言中我们面对的就是表这样的高级抽象,对于数据的变化就无外乎select、filter、join、sum 这样的几种操作类型。

那要解决我们的问题我们能首先想到的就是表自身join自身然后再聚合统计。

select count(*)/2  res
from user_friend a
join  user_friend b
on a.friend_uid=b.user_id and a.user_uid=b.friend_id

三、spark的解答方式

spark 里面不管是rdd还是dataframe这两种api其实和sql中表的抽象是类似的,都有map、filter、join、聚合这几种范式。所以解决方案和sql的思想类似。

四、终极复杂解决方案

其实 a->b , b->a 这之间只是顺序上的差别,a还是那个a,b还是那个b。我们只需要不在乎顺序a->b,b->a就是相同的两条记录,那我们就只需要统计一下这个表里面有两条相同记录的数据就能知道答案了。
python:

data_tmp = [ d[0]+d[1] if d[0] < d[1] else d[1]+d[0]   for d in data]
res = len(data_tmp) -  len( set(data_tmp) ) 
return res

sql(不用join):

select count(1) res
from (
    select union_id
    from (
        select if( friend_uid>user_uid 
                , concat(friend_uid, user_uid)
                , concat(user_uid, friend_uid )
              )  union_id
        from user_friend
    )tmp
    group by union_id
    having count(*)=2
)tmp2

关注众公号(曾二爷) 和优秀的人一起学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值