订阅更新

活跃业务:超过平均值的事件类型不少于两个

SQL 实战 123 题 · 第 64 题 中等 约 2 分钟读完

LeetCode 1126 · 窗口 AVG、和组内平均比较

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

用窗口 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

易错点

  • 平均值要按事件类型算,不是全表平均,也不是按业务平均。
刷题进度保存在当前浏览器