【leetcode-数据库】解题思路

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值