校招算法笔面试 | SQL笔试面试编程题-牛客的课程订单分析(三)

题目## 题目

题目链接

题目描述

我们有一个表:

  • order_info:包含订单信息,包括订单ID id、用户ID user_id、产品名称 product_name、订单状态 status、客户端ID client_id 和订单日期 date

目标是查询出在2025年10月15日之后,同一个用户下单2个及以上状态为“completed”的“C++”、“Java”或“Python”课程订单的信息,并按订单ID升序排序。

知识点

  • 条件过滤:使用WHERE子句筛选符合条件的记录。
  • 窗口函数:使用COUNT窗口函数计算每个用户的订单数量。
  • 排序:使用ORDER BY子句按订单ID升序排列结果。

关键问题分析

1. 筛选符合条件的订单

我们需要筛选出状态为“completed”的订单,产品名称为“C++”、“Java”或“Python”,并且订单日期在2025年10月15日之后:

where status = 'completed' and product_name in ('C++','Java','Python') and date > '2025-10-15'
2. 计算每个用户的订单数量

我们使用COUNT窗口函数计算每个用户的订单数量:

count(*) over(partition by user_id) as cnt
  • COUNT(*) OVER (PARTITION BY user_id) AS cnt: 计算每个用户的订单数量。

COUNT(*):普通聚合函数,用于计算整个表或分组的行数,必须与 GROUP BY 子句一起使用,否则不能与非聚合列一起使用。

COUNT(*) OVER (…):窗口函数,用于在一组行上执行聚合计算,同时保留每一行的细节,可以与非聚合列一起使用,不会违反 ONLY_FULL_GROUP_BY 模式。

类似用法题目考试分数(五)

3. 筛选订单数量大于等于2的用户

我们通过WHERE子句筛选出订单数量大于等于2的用户:

where cnt >= 2
4. 排序输出

我们按订单ID升序排列输出结果:

order by id

完整代码

select id, user_id, product_name, status, client_id, date
from (
    select
        id, user_id, product_name, status, client_id, date,
        count(*) over(partition by user_id) as cnt
    from order_info
    where status = 'completed' and product_name in ('C++','Java','Python') and date > '2025-10-15'
) sub
where cnt >= 2
order by id;

题目链接

题目描述

我们有两个表:

  • order_info:包含订单信息,包括订单ID id、用户ID user_id、产品名称 product_name、订单状态 status、客户端ID client_id、订单日期 date 和是否拼团 is_group_buy
  • client:包含客户端信息,包括客户端ID id 和客户端名称 name

目标是查询出在2025年10月15日之后,同一个用户下单2个及以上状态为“completed”的“C++”、“Java”或“Python”课程订单的来源信息,并按来源升序排序。

知识点

  • 条件过滤:使用WHERE子句筛选符合条件的记录。
  • 窗口函数:使用COUNT窗口函数计算每个用户的订单数量。
  • 连接操作:使用LEFT JOIN连接订单信息表和客户端表。
  • 条件判断:使用CASE语句处理拼团订单的来源显示。
  • 分组和排序:使用GROUP BYORDER BY子句进行分组和排序。

关键问题分析

1. 筛选符合条件的订单

我们需要筛选出状态为“completed”的订单,产品名称为“C++”、“Java”或“Python”,并且订单日期在2025年10月15日之后:

where status = 'completed' and product_name in ('C++','Java','Python') and date > '2025-10-15'
2. 计算每个用户的订单数量

我们使用COUNT窗口函数计算每个用户的订单数量:

count(*) over(partition by o.user_id) as cn
  • COUNT(*) OVER (PARTITION BY o.user_id) AS cn: 计算每个用户的订单数量。
3. 筛选订单数量大于等于2的用户

我们通过WHERE子句筛选出订单数量大于等于2的用户:

where sub.cn >= 2
4. 连接客户端信息

我们使用LEFT JOIN连接订单信息表和客户端表,以获取客户端名称:

left join client c on o.client_id = c.id
  • LEFT JOIN client c ON o.client_id = c.id: 连接客户端信息。
5. 处理拼团订单的来源显示

我们使用CASE语句处理拼团订单的来源显示:

select case when name is null then 'GroupBuy' else name end as source, count(*) as cnt
  • CASE WHEN name IS NULL THEN 'GroupBuy' ELSE name END AS source: 处理拼团订单的来源显示。
6. 分组和排序输出

我们按来源分组,并按来源升序排列输出结果:

group by name
order by source

完整代码

select case when name is null then 'GroupBuy' else name end as source, count(*) as cnt
from (
    select o.id, c.name,
           count(*) over(partition by o.user_id) as cn
    from order_info o
    left join client c on o.client_id = c.id
    where status = 'completed' and product_name in ('C++','Java','Python') and date > '2025-10-15'
) sub
where sub.cn >= 2
group by name
order by source;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值