LeetCode-数据库-2
584. 寻找用户推荐人
1 | SELECT |
577. 员工奖金
1 | SELECT |
570. 至少有5名直接下属的经理
1 | SELECT |
596. 超过5名学生的课
1 | SELECT |
595. 大的国家
1 | SELECT |
586. 订单最多的客户
1 | SELECT |
585. 2016年的投资
思路1
- join两个Insurance表,连接方式为pid不同
- 通过where筛选出2015投资相等的行
- 再来一个子查询找出所有location只出现一次的id
- 通过where筛选出满足条件的id
sql
1 | SELECT |
错误分析
- ON和 WHERE的条件可以互换吗?发现上面的结果不对,原因是使用了LEFT JOIN, 导致On后的条件没有满足,但是左侧都被保留了下来,需要改成内连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27SELECT
ROUND(SUM(T.tiv_2016), 2) as tiv_2016
FROM
(
SELECT
I1.pid,
MAX(I1.tiv_2016) as tiv_2016
FROM
Insurance I1
LEFT JOIN
Insurance I2
ON I1.pid != I2.pid AND
I1.tiv_2015 = I2.tiv_2015 AND
I1.pid IN
(
SELECT
pid
FROM
Insurance
GROUP BY
lat, lon
HAVING
COUNT(*) = 1
)
GROUP BY
I1.pid
) T
1 | SELECT |
思路2
- count() + over(parition by)
- count计算个数
- partition by指定计算时的聚合方法
sql
1 | SELECT |
602. 好友申请 II :谁有最多的好友
思路1
- a向b申请好友,通过后,a-b都互为好友
- 所以需要把requester和accepter互换后,使用UNION ALL连接
- 然后group by + count()
1 | SELECT |
思路2
- 题目的意思是不存在重复添加好友的情况,比如a加b,a删b,b加回a等情况
- 所以可以直接在子查询中计数,然后在外面求和,可以快一点
1 | SELECT |
1661. 每台机器的进程平均运行时间
- union前后必须加括号
1 | SELECT |
1341. 电影评分
1 | ( |
1141. 查询近30天活跃用户数
- 笨蛋,最近30天是往前数29天
1 | SELECT |
1731. 每位经理的下属员工数量
1 | # Write your MySQL query statement below |
1527. 患某种疾病的患者
LIKE
1 | # Write your MySQL query statement below |
REGEXP
- 写不出这个正则
\b
:匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。\B
:匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’
1 | # Write your MySQL query statement below |
1070. 产品销售分析 III
1 | SELECT |
rank
- over里面既能partition by, 也能order by
1 | SELECT |