0
点赞
收藏
分享

微信扫一扫

Leetcode curated SQL 刷题总结_1

GhostInMatrix 2022-01-28 阅读 111
leetcodesql

最近做了Easy部分的32道题,简单总结一下:

看书、做题、做完整项目是三回事;照着书敲代码、自己写完整代码又是两回事...基础当然要一步步打,但真的要多实践才行~

1. Consecutive available seats: 查询一个表中连续的数值 (自连接查询)

自连接后,利用abs(id1-id2)=1筛选‘连续’,别忘记加distinct(自连接后会有很多重复行)。

SELECT distinct a.seat_id
FROM cinema a JOIN cinema b
ON abs(a.seat_id-b.seat_id) = 1
AND a.free = TRUE AND b.free = TRUE
ORDER BY a.seat_id;

2. Sales Person: 销售员,公司,订单多表连接查询(不一定要把所有表join起来...)

SELECT name
FROM SalesPerson
WHERE sales_id not in
(
    SELECT o.sales_id
    FROM orders o
    JOIN company c
    ON o.com_id = c.com_id
    WHERE c.name = 'red'
)

 3. Project Employees II: Having的使用 (跟在group by后to specify filter conditions for a group of rows or aggregates.) 

(有了having,就不用把聚合函数写在select后了,如果不想要那一列聚合结果的话)

SELECT project_id
FROM project
GROUP BY project_id
HAVING count(employee_id) >= all
(
    SELECT count(employee_id)
    FROM project
    GROUP BY project_id
)

4.  Sales Analysis II: product, sale表,筛选买了a但没买b的buyerid(嵌套语句not in,描述另一个条件)

SELECT distinct buyer_id
FROM product p JOIN sales s
ON (p.product_id = s.product_id)
WHERE p.product_name = 'S8'
AND buyer_id not in
(SELECT buyer_id
FROM product p JOIN sales s
ON (p.product_id = s.product_id)
WHERE p.product_name = 'iPhone')

 5. Sales Analysis III: 4的变形题:用not in筛选另一个条件(注意加distinct; 用这两个筛选条件表达"only")

SELECT distinct p.product_id, p.product_name
FROM product p JOIN sales s
ON (p.product_id = s.product_id)
WHERE (s.sale_date between '2019-01-01' and '2019-03-31') AND p.product_id not in
(SELECT product_id FROM sales WHERE sale_date > '2019-03-31' OR sale_date < '2019-01-01')

6.  Game Play Analysis II: 筛选某字段最小值对应的另一字段(用<=all来表达)

SELECT player_id, device_id 
from Activity a1
WHERE event_date <= ALL
(SELECT event_date 
 FROM Activity a2 
 WHERE a1.player_id = a2.player_id )

7. Students and Examinations:想得到一个统一格式的总表,直接全连接;利用case when将缺少的记录填充为0,sum(case when...1...else 0...)来计数;groupby的聚合函数条件还可以放在case when里。

select a.student_id,a.student_name,b.subject_name
,sum(case when a.student_id=c.student_id and b.subject_name = c.subject_name then 1 else 0 end ) AS attended_exams
from students a ,subjects b , examinations c
group by a.student_id,a.student_name,b.subject_name
ORDER BY a.student_id, a.student_name

 8. Immediate Food Delivery I: 一张表的计算问题: 筛选一个表中符合某条件的行所占的比例:(count后不一定要加groupby,select后不一定要加from)

SELECT round(
(SELECT count(delivery_id) FROM delivery WHERE order_date = customer_pref_delivery_date)*100/
(SELECT count(*) FROM delivery),2) AS immediate_percentage

9. Average Selling Price:两张表的计算问题:(JOIN 的条件可以有多个,并且可以不是a=b这样的条件,任何条件都可以;GROUPBY 对应的聚合函数也可以不止单纯的avg或sum这种,可以进行聚合函数的运算) 

 

select p.product_id, ROUND(sum(price*units)/sum(units),2) as average_price 
from Prices p join UnitsSold u
ON (p.product_id = u.product_id AND (u.purchase_date between p.start_date and p.end_date))
group by p.product_id

10.  Ads Performance:一张表的计算问题:像7一样也是用sum(case when...1...0)来计数(这里用if语句也可以);利用coalesce将null填充为0

SELECT ad_id, 
COALESCE(round(SUM(IF(action = 'Clicked', 1, 0))/(sum(IF(action = 'Viewed', 1, 0))+sum(IF(action = 'Clicked', 1, 0)))*100,2),0) AS ctr FROM Ads
GROUP BY ad_id
ORDER BY ctr DESC, ad_id ASC;

11. Group Sold Products By The Date: group concat的使用(因为有一条重复记录,所以两个聚合函数里都要加distinct) 

SELECT sell_date, 
count(distinct product) AS num_sold, 
group_concat(distinct product order by product separator ',') AS products
FROM activities
GROUP BY sell_date
ORDER BY sell_date

12. Customer Order Frequency:with...as...把子表单独提出来,稍后调用,代码会比较清晰;转化问题:先把每月spending>=100的customerid和月份筛选出来放到子表里,再筛选月份只包括6&7月的。

WITH cte1 as (
SELECT customer_id, month(order_date) as month, sum(quantity*price) as spending
FROM Orders INNER JOIN Product USING(product_id)
group by month, customer_id
having spending >= 100)

SELECT customer_id, name
FROM cte1 INNER JOIN Customers c USING(customer_id)
WHERE month = 6 or month = 7
group by customer_id
HAVING count(month) = 2

13.  Find Users With Valid E-Mails:regexp正则表达式: 注意mysql的escape要用double back slash!

SELECT user_id, name, mail
FROM users
WHERE mail regexp '^[a-zA-Z][A-Za-z0-9_\\.\\-]*(@leetcode\\.com)$'

 

举报

相关推荐

0 条评论