https://leetcode.cn/study-plan/sql/?progress=jgmzq5s
第5天 合并
175. 组合两个表
就是一个简单的left join
1581. 进店却未进行过交易的顾客
Q:两个表Visits(有visit_id和customer_id两列)和Transactions(有transaction_id、visit_id和amount三列)。返回只光顾、没交易的顾客的customer_id,以及只光顾不交易的次数count_no_trans
select customer_id,
count(customer_id) as count_no_trans
from Visits
where visit_id not in(
select visit_id from Transactions
)
group by customer_id
分析过程:
select customer_id, # 结果是30 96 54 54
count(customer_id) as count_no_trans # 结果是1 1 2
from Visits
where visit_id not in( # 结果是4 6 7 8
select visit_id from Transactions
)
group by customer_id
1148. 文章浏览I
查找所有浏览过自己文章的作者,其实就是 author_id = viewer_id 就行了
这题要注意的是,此表无主键,因此可能会存在重复行,所以要加一个distinct
第6天 合并
197. 上升的温度
Q:表Weather有三列,id、recordDate和temperature。查询与昨天的日期相比,温度更高的所有日期的id
select a.id from Weather a, Weather b
where a.temperature > b.temperature
and datediff(a.recordDate, b.recordDate) = 1
datediff() 返回两个日期的天数
[Mysql] DATEDIFF函数
datediff(date1, date2) # 返回date1-date2的结果
date1和date2两个参数需要是有效的日期或日期时间值。如果参数传递的是日期时间值,仅将日期部分用于计算,并忽略时间部分(只有值的日期部分参与计算)
607. 销售员
Q:三个表,查询没有任何与名为“RED”的公司相关订单的所有销售人员的姓名
SalesPerson表:sales_id、name、salary、commission_rate、hire_date【销售人员id、姓名、工资、佣金率、雇佣日期】
Company表:com_id、name、city【公司id、名称、所在城市】
Orders表:order_id、order_date、com_id、sales_id、amount【订单id、日期、公司id、销售人员id、支付金额】
三个表的嵌套查询
select name from SalesPerson
where sales_id not in (
select sales_id from Orders
where com_id = (
select com_id from Company
where name = 'RED'
)
)
第7天 计算函数
1141. 查询近30天活跃用户数
Q:表Activity是用户在社交网站的活动记录。无主键,可能包含重复数据
user_id
session_id:每个session_id只属于一个用户【一个用户一天可能对应多个session_id】
activity_date
activity_type:enum类型,为以下四种值 ('open_session', 'end_session', 'scroll_down', 'send_message')
查询出截至2019-07-27(含),近30天的每日活跃用户数(当天只要有一条活动记录,即为活跃用户)
select activity_date as day,
count(distinct user_id) as active_users
from Activity
where datediff('2019-07-27', activity_date)<30 and datediff('2019-07-27', activity_date)>=0
group by activity_date
注意“截至date1(包含date1这天)近30天”的写法:
datediff(date1, 日期列) between 0 and 29
1693. 每天的领导和合伙人
重点在于知道group by后面可以加多个字段就行
1729. 求关注者的数量
无
第8天 计算函数
586. 订单最多的客户
这里注意,求出每个客户的订单数后,可以把订单数降序排序,再limit 1即是订单数最多的那个
511. 游戏玩法分析I
查询每位玩家第一次登录平台的日期,对日期取min() 即可
1890. 2020年最后一次登录
跟上题相反,最后一次登录,对日期取max() 即可
1741. 查询每个员工花费的总时间
这里注意,在一天之内,同一员工是可以多次进入和离开办公室的,所以需要sum() 求总时间,同时group by的时候,需要对event_day(同一天)和emp_id(同一员工)都处理