1. 力扣586:订单最多的客户
1.1 题目:
表: Orders
+-----------------+----------+ | Column Name | Type | +-----------------+----------+ | order_number | int | | customer_number | int | +-----------------+----------+ 在 SQL 中,Order_number是该表的主键。 此表包含关于订单ID和客户ID的信息。
查找下了 最多订单 的客户的 customer_number
。
测试用例生成后, 恰好有一个客户 比任何其他客户下了更多的订单。
查询结果格式如下所示。
示例 1:
输入: Orders 表: +--------------+-----------------+ | order_number | customer_number | +--------------+-----------------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | | 4 | 3 | +--------------+-----------------+ 输出: +-----------------+ | customer_number | +-----------------+ | 3 | +-----------------+ 解释: customer_number 为 '3' 的顾客有两个订单,比顾客 '1' 或者 '2' 都要多,因为他们只有一个订单。 所以结果是该顾客的 customer_number ,也就是 3 。
进阶: 如果有多位顾客订单数并列最多,你能找到他们所有的 customer_number
吗?
1.2 思路
内部的select语句以客户ID分组,得到所有的分组个数,然后ALL关键字,外部的个数大于等于内部select所有的个数,可以找到订单个数最多的客户ID即可。
1.3 题解;
select customer_number
from Orders
group by customer_number
having count(customer_number) >= ALL (
select count(customer_number)
from Orders
group by customer_number
)
2. 力扣608:树节点
2.1 题目:
表:Tree
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | p_id | int | +-------------+------+ id 是该表中具有唯一值的列。 该表的每行包含树中节点的 id 及其父节点的 id 信息。 给定的结构总是一个有效的树。
树中的每个节点可以是以下三种类型之一:
- "Leaf":节点是叶子节点。
- "Root":节点是树的根节点。
- "lnner":节点既不是叶子节点也不是根节点。
编写一个解决方案来报告树中每个节点的类型。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入: Tree table: +----+------+ | id | p_id | +----+------+ | 1 | null | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 2 | +----+------+ 输出: +----+-------+ | id | type | +----+-------+ | 1 | Root | | 2 | Inner | | 3 | Leaf | | 4 | Leaf | | 5 | Leaf | +----+-------+ 解释: 节点 1 是根节点,因为它的父节点为空,并且它有子节点 2 和 3。 节点 2 是一个内部节点,因为它有父节点 1 和子节点 4 和 5。 节点 3、4 和 5 是叶子节点,因为它们有父节点而没有子节点。
示例 2:
输入: Tree table: +----+------+ | id | p_id | +----+------+ | 1 | null | +----+------+ 输出: +----+-------+ | id | type | +----+-------+ | 1 | Root | +----+-------+ 解释:如果树中只有一个节点,则只需要输出其根属性。
注意:本题与 3054. 二叉树节点 一致。
2.2 思路:
很容易想到是case when then end结构。注意最后用end结束该语句
2.3 题解:
-- 三种情况,很容易想到用判断语句
-- case when then
-- 当p_id是null时,肯定为根节点
-- 如果该节点是其他节点的父亲(执行到这默认p_id不为null),就是内节点
-- 否则就是叶子节点
select id, (case when p_id is null then 'Root'
when id in (select p_id from Tree)then 'Inner'
else 'Leaf'
end) type
from Tree
3. 力扣 184:部门工资最高的员工
3.1 题目:
表: Employee
+--------------+---------+ | 列名 | 类型 | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ 在 SQL 中,id是此表的主键。 departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。 此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。
表: Department
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ 在 SQL 中,id 是此表的主键列。 此表的每一行都表示一个部门的 id 及其名称。
查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。
示例 1:
输入: Employee 表: +----+-------+--------+--------------+ | id | name | salary | departmentId | +----+-------+--------+--------------+ | 1 | Joe | 70000 | 1 | | 2 | Jim | 90000 | 1 | | 3 | Henry | 80000 | 2 | | 4 | Sam | 60000 | 2 | | 5 | Max | 90000 | 1 | +----+-------+--------+--------------+ Department 表: +----+-------+ | id | name | +----+-------+ | 1 | IT | | 2 | Sales | +----+-------+ 输出: +------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Jim | 90000 | | Sales | Henry | 80000 | | IT | Max | 90000 | +------------+----------+--------+ 解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
3.2 思路:
先将两张表拼接起来,内部子查询查询到外部记录的所在部门的最高薪资,然后跟外部记录比较,如果是大于等于,就说明该记录的薪资就是该部门的最高薪资。
3.3 题解:
select d.name Department, e.name Employee, e.salary Salary
from Employee e join Department d
on e.departmentId = d.id
where salary >= (
-- 相关子查询
-- 查询到外面表的记录的所在部门的最高薪资
-- 部门id分组,外面记录的部门id与分组id相匹配,从而找到所在部门id
select MAX(salary)
from Employee e1
group by e1.departmentId
having e1.departmentId = e.departmentId
);