119,SQL训练之,力扣,1126. 查询活跃业务

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,原题力扣链接

二,题干

三,建表语句

四,分析

五,SQL解答

六,验证

七,知识点总结


一,原题力扣链接

. - 力扣(LeetCode)

二,题干

事件表: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开窗的运用
  • 条件过滤的运用
  • 分组+聚合+过滤的运用

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值