活跃业务:超过平均值的事件类型不少于两个
LeetCode 1126 · 窗口 AVG、和组内平均比较
面试怎么回答
用窗口 AVG(occurences) OVER (PARTITION BY event_type) 得到每种事件类型的平均次数,过滤出 occurences 大于平均的行,再按 business_id 分组 HAVING COUNT(*) >= 2。「和组内平均比较」是窗口聚合最典型的用法,比关联一个分组子查询更简洁。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
事件表记录每个业务每种事件类型的发生次数。如果一个业务有至少两种事件类型的次数,超过了该事件类型在所有业务中的平均次数,它就是活跃业务。找出所有活跃业务。
表结构
- Events:business_id、event_type、occurences;(business_id, event_type) 为主键
思路
每一行要和「同一事件类型的平均次数」比较,用 AVG(occurences) OVER (PARTITION BY event_type) 把平均值挂到每行上,筛出超过平均的行,再按业务分组计数 ≥ 2。
参考解法
select business_id
from (
select business_id,occurences,
avg(occurences) over(partition by event_type) avo
from Events
)t1
where occurences > avo
group by business_id
having count(*)>=2
易错点
- 平均值要按事件类型算,不是全表平均,也不是按业务平均。