图解面试题:如何交换数据?

    技术2022-07-14  80

    原创 猴子 猴子数据分析 2月6日

    【题目】小明是一所学校的老师,她有一张 ‘学生表’,平时用来存放座位号和学生的信息。其中,座位号是连续递增的。总的座位数是偶数。

     

     

    现在,小明想改变相邻俩学生的座位。你能不能帮她写一个sql查来输出想要的结果呢?

     

    示例查询结果如下:

    【解题思路】

    第一步:理清换座位的逻辑

    查询目的是改变相邻学生的座位号。为了理清逻辑,在原表中插入一列叫做‘奇偶数’,对应表示“座位号”的值是“奇数”还是“偶数”。

    然后比较原始表里的“座位号”和交换结果里的“座位号”(对比分析方法),可以发现下图的规律。

    1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为“座位号+1”。

    2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为“座位号-1”。

    第二步:如何判断座位号是奇数,还是偶数

    sql求余函数:mod(n,m) ,返回n除以m的余数。比如mod(8,2) 的结果是0。

    如果n除以2的余数是0,说明n是偶数,否则是奇数。

    转换为判断奇数,偶数的sql就是:

    case when mod(座位号, 2) != 0 then '奇数' when mod(座位号, 2) = 0 then '偶数'end

    把前面的逻辑写到sql里就是:

    1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为“座位号+1”。

    2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为“座位号-1”。

    case       when mod(座位号, 2) != 0  then 座位号 + 1       when mod(座位号, 2)  = 0  then 座位号 - 1end  as  '交换后座位号'

    加入select字句,就是最好的结果:

    select (case             when mod(座位号, 2) != 0  then 座位号 + 1             when mod(座位号, 2)  = 0  then 座位号 - 1 end) as '交换后座位号', 姓名from 学生表;

    【本题考点】

    1.逻辑思维能力,如何使用对比分析方法发现规律

    2.条件判断语句case

    3.如何判断奇数和偶数:mod函数

    【举一反三】

    原始座次表 ‘seat’如下,现需要更换相邻位置学生的座次。

    注:该座次表‘seat’共有5名学生,第5个 座位号是奇数的不变

    查询逻辑和前面一样,但是座位总数是奇数,所以:如果最后一个座位号也是奇数,那么他没有可以交换的座位了,所以最后一个座位号的学生不变。

    最后一个座位号,等于表里有多少行,可以用count(*) 计算出来

    # 最后一个座位号select count(*) as counts from seat;

    最后一个座位号作为条件判断使用时,可以使用子查询,以便调用。最终sql如下。

    select    (case      # 当座位号是奇数并且不是不是最后一个座位号时        when mod(id, 2) != 0 and counts!= id then id + 1       # 当座位号是奇数并且是最后一个座位号时,座位号不变        when mod(id, 2) != 0 and counts = id then id       # 当座位号是偶数时        else id - 1    end) as id2,studentfrom seat,(select count(*) as counts from seat);
    Processed: 0.014, SQL: 9