1.概述
用于记录自己的答案与思路,持续更新。
2.题目+思路+答案
585.2016年的投资
题目:写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数。
- 对于一个投保人,他在 2016 年成功投资的条件是:
- 他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
- 他所在的城市必须与其他投保人都不同(也就是说维度和经度不能跟其他任何一个投保人完全相同)。
思路:按条件暴力排除
答案
SELECT
SUM(insurance.TIV_2016) AS TIV_2016
FROM
insurance
WHERE
insurance.TIV_2015 IN
(
SELECT
TIV_2015
FROM
insurance
GROUP BY TIV_2015
HAVING COUNT(*) > 1
)
AND CONCAT(LAT, LON) IN
(
SELECT
CONCAT(LAT, LON)
FROM
insurance
GROUP BY LAT , LON
HAVING COUNT(*) = 1
)
586.订单最多的用户
题目:订单最多的用户
思路:查找每个用户的订单数量,倒序取第一条
答案
SELECT
customer_number
FROM
orders
GROUP BY customer_number
ORDER BY COUNT(customer_number) DESC
LIMIT 1
608.树节点
题目:给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。
- 树中每个节点属于以下三种类型之一:
- 叶子:如果这个节点没有任何孩子节点。
- 根:如果这个节点是整棵树的根,即没有父节点。
- 内部节点:如果这个节点既不是叶子节点也不是根节点。
思路:找出每个节点父节点子节点;然后按规则写
答案
SELECT
res.id
,(case when res.c_id is null then 'Leaf'
when res.p_id id null then 'Root'
else 'Inner' end) as Type
FROM (
SELECT
t1.id,t1.p_id
,t2.id as c_id --子节点
FROM tree t1
LEFT JOIN tree t2 on t1.id = t2.p_id) res
610.判断三角形
题目:一个小学生 Tim 的作业是判断三条线段是否能形成一个三角形。然而,这个作业非常繁重,因为有几百组线段需要判断。假设表 triangle 保存了所有三条线段的长度 x、y、z ,请你帮 Tim 写一个查询语句,来判断每组 x、y、z 是否可以组成一个三角形?
思路:三角形的特性是两边之和大于第三边
答案
SELECT
*
,(case when x+y > z and x+z>y and y+z>x THEN 'Yes' ElSE 'No' END) as triangle
FROM triangle
612.平面上的最近距离
题目:表 point_2d 保存了所有点(多于 2 个点)的坐标 (x,y) ,这些点在平面上两两不重合。写一个查询语句,找到这些点中最近两个点之间的距离。
思路:先将点与点匹配,再利用点与点的距离公式计算出最小距离
答案
SELECT
ROUND(MIN(SQRT(POW(y2-y1, 2) + POW(x2-x1, 2))),2) AS shortest
FROM
(SELECT
p1.x as x1
,p1.y as y1
,p2.x as x2
,p2.y as y2
FROM point_2d p1 LEFT JOIN point_2d p2
ON p1.x != p2.x OR p1.y != p2.y) mid
613.直线上的最近距离
题目:表 point 保存了一些点在 x 轴上的坐标,这些坐标都是整数。写一个查询语句,找到这些点中最近两个点之间的距离。
思路:因为是直线,自关联减法即得距离
答案
SELECT
MIN(res.distance) AS shortest
FROM
(SELECT
p1.x as x1, p2.x as x2, ABS(p1.x - p2.x) AS distance
FROM
point p1
JOIN
point p2 ON p1.x != p2.x) res