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

作者: 曾二爷耶 | 来源:发表于2019-03-02 17:32 被阅读2次

上次的题目( https://www.jianshu.com/p/55c4a97f58fd ) 大家都看了吗,感觉是不是贼简单,竟然做这种题,简直侮辱智商,不介意的话我来说下大家心里是不是这样解答的👇。

一、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

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

相关文章

网友评论

    本文标题:【解答】sql和其他语言的思考方式

    本文链接:https://www.haomeiwen.com/subject/xutyuqtx.html