百度大数据面试SQL-搜索日志中最热门的10个查询词
⚠️ 待修正
一、题目背景
这道题来自百度搜索事业部的数据分析岗面试。百度每天处理数十亿次搜索请求,"热门搜索词Top 10"是最基础的搜索数据分析需求。通过热门搜索词可以了解用户关注的热点、发现舆情趋势、优化搜索排序和广告投放策略。
业务场景:百度风云榜的背后就是这类查询——实时统计搜索词热度排名。运营和PR团队每天盯榜,一旦发现某个关键词搜索量暴涨(如"某品牌质量投诉"),可以第一时间做舆情应对。
二、题目
现有一张搜索日志表 t5_search_log,记录了用户每次搜索的查询词。请统计搜索次数最多的前10个查询词(Top 10热门搜索词)。
搜索日志表 t5_search_log:
+----------+-------------------+---------------------+
| user_id | query_word | search_time |
+----------+-------------------+---------------------+
| u01 | 天气预报 | 2023-03-01 08:00:00 |
| u02 | 股票行情 | 2023-03-01 08:05:00 |
| u01 | 百度地图 | 2023-03-01 09:00:00 |
| u03 | 天气预报 | 2023-03-01 09:10:00 |
| u04 | 世界杯 | 2023-03-01 09:15:00 |
| u02 | 天气预报 | 2023-03-01 09:20:00 |
| u05 | 高考成绩 | 2023-03-01 10:00:00 |
| u01 | 股票行情 | 2023-03-01 10:30:00 |
| u03 | 百度地图 | 2023-03-01 11:00:00 |
| u04 | 天气预报 | 2023-03-01 11:30:00 |
| u06 | 深度学习 | 2023-03-01 12:00:00 |
| u07 | 天气预报 | 2023-03-01 12:30:00 |
| u08 | ChatGPT | 2023-03-01 13:00:00 |
| u05 | 世界杯 | 2023-03-01 14:00:00 |
| u06 | 百度地图 | 2023-03-01 15:00:00 |
+----------+-------------------+---------------------+
三、思路分析
本题是最基础的聚合排序题,考察 GROUP BY + ORDER BY + LIMIT:
- 分组统计:
GROUP BY query_word按查询词分组,COUNT(1)统计搜索次数 - 降序排列:
ORDER BY search_cnt DESC按搜索次数从高到低 - 取前N条:
LIMIT 10取出排名前10的热门词
| 维度 | 评分 |
|---|---|
| 题目难度 | ⭐️ |
| 题目清晰度 | ⭐️⭐️⭐️⭐️⭐️ |
| 业务常见度 | ⭐️⭐️⭐️⭐️⭐️ |
四、逐步推导
统计热门搜索词Top 10
一道查询即可完成:按查询词分组→统计次数→降序→取前10。
执行SQL
select query_word,
count(1) as search_cnt
from t5_search_log
group by query_word
order by search_cnt desc
limit 10
执行结果
+-------------------+------------+
| query_word | search_cnt |
+-------------------+------------+
| 天气预报 | 5 |
| 百度地图 | 3 |
| 股票行情 | 2 |
| 世界杯 | 2 |
| 高考成绩 | 1 |
| 深度学习 | 1 |
| ChatGPT | 1 |
+-------------------+------------+
"天气预报"以5次搜索高居榜首。实际百度搜索中Top 10通常被娱乐八卦、社会热点占据,但面试数据更"干净"。
五、常见坑点
坑1:COUNT vs COUNT DISTINCT 的选择
如果同一个用户多次搜索同一个词(如 u01 搜了两次"天气预报"),用 COUNT(1) 算的是搜索次数,用 COUNT(DISTINCT user_id) 算的是搜索人数。本题目的是"热门搜索词"应该算次数,所以用 COUNT(1)。
坑2:LIMIT 的方言差异
LIMIT 10 在 Hive/Spark/MySQL 通用。SQL Server 用 SELECT TOP 10,Oracle 用 WHERE ROWNUM <= 10。面试时注明你用的SQL方言即可。
六、举一反三
- 按天统计每日Top 10:加
GROUP BY date, query_word,用ROW_NUMBER() OVER (PARTITION BY date ORDER BY COUNT(1) DESC)取每日Top 10 - 热门词的趋势变化:
LAG(search_cnt) OVER (PARTITION BY query_word ORDER BY date)看每个词搜索量的日环比变化 - 长尾词占比:统计搜索次数=1的关键词占比,通常长尾词占搜索总量的60-80%
- 热门词分类:关联关键词分类表,统计各类别(天气、财经、体育等)的搜索热度分布
七、知识点总结
| 考点 | 说明 |
|---|---|
| GROUP BY + COUNT | 按查询词聚合,统计每个词的搜索频率 |
| ORDER BY DESC | 降序排列,热度最高的排最前面 |
| LIMIT N | 取前N条记录,实现Top N效果 |
八、建表语句和数据插入
点击展开 DDL & DML
CREATE TABLE t5_search_log (
user_id string COMMENT '用户ID',
query_word string COMMENT '查询词',
search_time string COMMENT '搜索时间'
) COMMENT '搜索日志表';
INSERT INTO t5_search_log VALUES
('u01', '天气预报', '2023-03-01 08:00:00'),
('u02', '股票行情', '2023-03-01 08:05:00'),
('u01', '百度地图', '2023-03-01 09:00:00'),
('u03', '天气预报', '2023-03-01 09:10:00'),
('u04', '世界杯', '2023-03-01 09:15:00'),
('u02', '天气预报', '2023-03-01 09:20:00'),
('u05', '高考成绩', '2023-03-01 10:00:00'),
('u01', '股票行情', '2023-03-01 10:30:00'),
('u03', '百度地图', '2023-03-01 11:00:00'),
('u04', '天气预报', '2023-03-01 11:30:00'),
('u06', '深度学习', '2023-03-01 12:00:00'),
('u07', '天气预报', '2023-03-01 12:30:00'),
('u08', 'ChatGPT', '2023-03-01 13:00:00'),
('u05', '世界杯', '2023-03-01 14:00:00'),
('u06', '百度地图', '2023-03-01 15:00:00');
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
