跳到主要内容

百度大数据面试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:

  1. 分组统计GROUP BY query_word 按查询词分组,COUNT(1) 统计搜索次数
  2. 降序排列ORDER BY search_cnt DESC 按搜索次数从高到低
  3. 取前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方言即可。

六、举一反三

  1. 按天统计每日Top 10:加 GROUP BY date, query_word,用 ROW_NUMBER() OVER (PARTITION BY date ORDER BY COUNT(1) DESC) 取每日Top 10
  2. 热门词的趋势变化LAG(search_cnt) OVER (PARTITION BY query_word ORDER BY date) 看每个词搜索量的日环比变化
  3. 长尾词占比:统计搜索次数=1的关键词占比,通常长尾词占搜索总量的60-80%
  4. 热门词分类:关联关键词分类表,统计各类别(天气、财经、体育等)的搜索热度分布

七、知识点总结

考点说明
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真题

交流微信二维码

你可能还想看