题目难度
中等
题目描述
写一段 SQL 来查询所有活跃的业务。
如果一个业务的某个事件类型的发生次数大于此事件类型在所有业务中的平均发生次数,并且该业务至少有两个这样的事件类型,那么该业务就可被看做是活跃业务。
查询结果格式如下所示:
‘reviews’、 ‘ads’ 和 ‘page views’ 的总平均发生次数分别是 (7+3)/2=5, (11+7+6)/3=8, (3+12)/2=7.5。
id 为 1 的业务有 7 个 ‘reviews’ 事件(大于 5)和 11 个 ‘ads’ 事件(大于 8),所以它是活跃业务。
正确答案
select business_id
from Events e
left join
(select event_type,avg(occurences) as average
from Events
group by event_type) t
on e.event_type=t.event_type
where e.occurences>t.average
group by business_id
having count(distinct e.event_type)>=2
思路
- 先计算各事件类型(event_type)的平均发生次数(average)左连接到原表中。
- where筛选出发生次数大于均值的事件
注意这里通过where筛选,而不是在左连接时on中筛选。如果把条件放在on中,会把不满足条件的数据用null填充,而不是筛选掉原表中的数据。容易混淆。 - group by+having筛选出至少两个事件大于平均次数的业务。
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/active-businesses