- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
事件表:
Events
+---------------+---------+ | Column Name | Type | +---------------+---------+ | business_id | int | | event_type | varchar | | occurrences | int | +---------------+---------+ (business_id, event_type) 是这个表的主键(具有唯一值的列的组合)。 表中的每一行记录了某种类型的事件在某些业务中多次发生的信息。平均活动 是指有特定
event_type
的具有该事件的所有公司的occurrences
的均值。活跃业务 是指具有 多个
event_type
的业务,它们的occurrences
严格大于 该事件的平均活动次数。写一个解决方案,找到所有 活跃业务。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入: Events table: +-------------+------------+-------------+ | business_id | event_type | occurrences | +-------------+------------+-------------+ | 1 | reviews | 7 | | 3 | reviews | 3 | | 1 | ads | 11 | | 2 | ads | 7 | | 3 | ads | 6 | | 1 | page views | 3 | | 2 | page views | 12 | +-------------+------------+-------------+ 输出: +-------------+ | business_id | +-------------+ | 1 | +-------------+ 解释: 每次活动的平均活动可计算如下: - 'reviews': (7+3)/2 = 5 - 'ads': (11+7+6)/3 = 8 - 'page views': (3+12)/2 = 7.5 id=1 的业务有 7 个 'reviews' 事件(多于 5 个)和 11 个 'ads' 事件(多于 8 个),所以它是一个活跃的业务。
三,建表语句
Create table If Not Exists Events (business_id int, event_type varchar(10), occurrences int);
Truncate table Events;
insert into Events (business_id, event_type, occurrences) values ('1', 'reviews', '7');
insert into Events (business_id, event_type, occurrences) values ('3', 'reviews', '3');
insert into Events (business_id, event_type, occurrences) values ('1', 'ads', '11');
insert into Events (business_id, event_type, occurrences) values ('2', 'ads', '7');
insert into Events (business_id, event_type, occurrences) values ('3', 'ads', '6');
insert into Events (business_id, event_type, occurrences) values ('1', 'page views', '3');
insert into Events (business_id, event_type, occurrences) values ('2', 'page views', '12');
select * from Events;
四,分析
表格大法
第一步:开一新列,以事件类型分组,统计每个事件类型的平均值
第二步:过滤 掉活动次数小于平均的
第三步:以记录id分组 cnt记录id的数量 过滤出大于1的值 第四步:拿到记录id 并输出
解题过程
代码实现以上过程
第一步:开一新列,以事件类型分组,统计每个事件类型的平均值
在mysql
第二步:过滤 掉活动次数小于平均的
在mysql
第三步:以记录id分组 cnt记录id的数量 过滤出大于1的值
在mysql
第四步:拿到记录id 并输出
五,SQL解答
with t1 as (
select
business_id, event_type, occurrences,
avg(occurrences) over(partition by event_type) ao
from Events
)
# select * from t1;
,t2 as (
select
business_id, event_type, occurrences, ao
from t1 where occurrences>ao
)
# select * from t2;
select business_id from t2 group by business_id having count(business_id)>1;
六,验证
七,知识点总结
- avg开窗的运用
- 条件过滤的运用
- 分组+聚合+过滤的运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用