校招算法笔面试 | SQL笔试面试编程题-给出employees表中排名为奇数行的first_name

题目## 题目## 题目## 题目

题目链接

这道题目要求我们给出employees表中排名为奇数行的first_name,我们要做的事情如下:

1. 确定总体问题

我们需要从员工表中提取名字,并按照名字的字母顺序排序后,输出排名为奇数的名字。

2. 分析关键问题
  • 排序名字并分配排名:使用ROW_NUMBER窗口函数按照名字的字母顺序为每个名字分配一个排名。
  • 筛选奇数排名的名字:通过WHERE子句筛选出排名为奇数的名字。
3. 解决每个关键问题的代码及讲解
步骤1:排序名字并分配排名

我们使用ROW_NUMBER窗口函数按照名字的字母顺序为每个名字分配一个排名:

select
    first_name,
    row_number() over(order by first_name asc) as rk
from employees
  • ROW_NUMBER() OVER (ORDER BY first_name ASC) AS rk:为每个名字分配一个排名,按照名字的字母顺序。
步骤2:筛选奇数排名的名字

我们通过WHERE子句筛选出排名为奇数的名字:

select 
    e.first_name as Georgi
from
    employees e
join 
    (
       --子函数
    ) sub on e.first_name = sub.first_name
where
    rk%2!=0
  • WHERE rk % 2 != 0:筛选出排名为奇数的名字。
  • 因为直接排序后输出会导致顺序变化,而题目要求原顺序输出,所以使用表连接。
  • 注意表连接和排序保持一致,否则容易导致顺序改变。

完整代码

select 
    e.first_name as Georgi
from
    employees e
join 
    (
        select
        first_name,
        row_number() over(order by first_name asc) as rk
        from employees
    ) sub on e.first_name = sub.first_name
where
    rk%2!=0;

题目链接

这道题目要求我们统计在晚上特定时间段里各个直播间的在线人数,我们要做的事情如下:

1. 确定总体问题

我们需要统计在晚上11点到12点之间,各个直播间的在线人数,并按在线人数降序排序。

2. 分析关键问题
  • 连接表:将user_view_tbroom_info_tb表连接起来,以便获取每个直播间的名称。
  • 筛选时间段:筛选出在晚上11点到12点之间在线的用户。
  • 计算独立用户数:对每个直播间的独立用户数进行计数。
  • 排序输出:按在线人数降序排序。
3. 解决每个关键问题的代码及讲解
步骤1:连接表

我们使用JOINuser_view_tbroom_info_tb表连接起来:

FROM 
    user_view_tb u
JOIN 
    room_info_tb r ON u.room_id = r.room_id
  • JOIN room_info_tb r ON u.room_id = r.room_id:通过直播间ID连接两个表,以便获取每个直播间的名称。
步骤2:筛选时间段

我们使用WHERE子句筛选出在晚上11点到12点之间在线的用户:

WHERE 
     u.in_time <= '23:59:59' AND u.out_time >= '23:00:00'
  • u.in_time <= '23:59:59' AND u.out_time >= '23:00:00':筛选出在指定时间段内在线的用户。
步骤3:计算独立用户数

我们使用COUNT(DISTINCT u.user_id)对每个直播间的独立用户数进行计数:

SELECT 
    u.room_id,
    r.room_name,
    COUNT(DISTINCT u.user_id) AS user_count
  • COUNT(DISTINCT u.user_id) AS user_count:计算每个直播间的独立在线用户数,DISTINCT去重。
步骤4:排序输出

我们使用ORDER BY按在线人数降序排序输出结果:

ORDER BY 
    user_count DESC

完整代码

SELECT 
    u.room_id,
    r.room_name,
    COUNT(DISTINCT u.user_id) AS user_count
FROM 
    user_view_tb u
JOIN 
    room_info_tb r ON u.room_id = r.room_id
WHERE 
     u.in_time <= '23:59:59' AND u.out_time >= '23:00:00'
GROUP BY 
    u.room_id, r.room_name
ORDER BY 
    user_count DESC;

题目链接

这道题目要求我们找出下单次数最多的前三个用户,我们要做的事情如下:

1. 确定总体问题

我们需要统计每个用户的下单次数,并按次数降序排列,并找出下单次数最多的前三个用户,返回这些用户的ID及其下单次数。

2. 分析关键问题
  • 筛选下单记录:从user_client_log表中筛选出步骤为order的记录。
  • 统计下单次数:对每个用户的下单次数进行计数。
  • 排序和筛选:按下单次数降序排列,并取出下单次数最多的前三个用户。
3. 解决每个关键问题的代码及讲解
步骤1:筛选下单记录

我们使用WHERE子句筛选出步骤为order的记录:

where 
    step = 'order'
  • WHERE step = 'order':筛选出所有下单记录。
步骤2:统计下单次数

我们使用COUNT函数对每个用户的下单次数进行计数,并按用户ID分组:

select
    uid,
    count(*) as cnt
from
    user_client_log
group by
    uid
  • COUNT(*) AS cnt:计算每个用户的下单次数。
  • GROUP BY uid:按用户ID分组。
步骤3:排序和筛选

我们使用ORDER BY按下单次数降序排列,并使用LIMIT取出下单次数最多的前三个用户:

order by
    cnt desc, uid
limit 3
  • ORDER BY cnt DESC, uid:按下单次数降序排列,若次数相同则按用户ID升序排列。
  • LIMIT 3:取出下单次数最多的前三个用户。

完整代码

select
    uid,
    count(*) as cnt
from
    user_client_log
where 
    step = 'order'
group by
    uid
order by
    cnt desc, uid
limit 3;

题目链接

最近做了京东的24年春招题,题目如下:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

题目分析

在这道题目中,我们需要从两个表中提取数据:orderscustomers。以下是每个表的结构及字段的汉语意思:

  1. orders(订单表)

    • order_id:订单ID
    • customer_id:客户ID
    • total_amount:订单总金额
  2. customers(客户表)

    • customer_id:客户ID
    • city:城市

目标:计算每个城市的订单总金额。

输出要求:输出每个城市的名称及其订单总金额,按订单总金额降序排列,如果总金额相同则按城市名称升序排列。

知识点关键词:SQL连接、聚合函数、分组、排序

解答步骤

  1. 连接表

    我们需要将 orders 表和 customers 表连接在一起,以便获取每个订单的城市信息。使用 JOIN 语句通过 customer_id 字段连接两个表。

    from orders o
    join customers c on c.customer_id = o.customer_id
    
  2. 计算城市订单总金额

    使用 SUM 函数计算每个城市的订单总金额。通过 GROUP BY 语句按城市分组,以便对每个城市的订单金额进行求和。

    select c.city,
    sum(o.total_amount) as total_order_amount
    group by c.city
    
  3. 排序

    使用 ORDER BY 语句按订单总金额降序排列结果,如果总金额相同则按城市名称升序排列。

    order by total_order_amount desc, c.city asc
    

完整代码

select c.city,
sum(o.total_amount) as total_order_amount
from orders o
join customers c on c.customer_id = o.customer_id
group by c.city
order by total_order_amount desc, c.city asc

近似题目练习推荐

获取指定客户每月的消费额

  • 知识点:SQL连接、聚合函数、分组、日期函数

统计所有课程参加培训人次

  • 知识点:字符串处理、聚合函数、分组

返回顾客名称和相关订单号以及每个订单的总价

  • 知识点:SQL连接、聚合函数、分组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值