SQL 网站场景面试题, 编写 SQL,使用开窗函数查询每个用户最近一次访问的页面路径及其访问日期
SQL 网站场景面试题, 编写 SQL,使用开窗函数查询每个用户最近一次访问的页面路径及其访问日期
QA
Step 1
Q:: 使用开窗函数查询每个用户最近一次访问的页面路径及其访问日期。
A:: 可以使用如下SQL语句:
SELECT user_id, page_path, visit_date
FROM (
SELECT user_id, page_path, visit_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY visit_date DESC) as rn
FROM user_visits
) t
WHERE rn = 1;
该SQL语句通过开窗函数 ROW_NUMBER()
按照每个用户的访问日期进行排序,并选出每个用户最近的一次访问记录。
Step 2
Q:: 什么是开窗函数?在SQL中如何使用?
A:: 开窗函数是一种在结果集中进行计算的函数,但与普通的聚合函数不同,它不会将行合并为单个结果,而是在结果集的每一行中执行计算。常用的开窗函数有 ROW_NUMBER()``,
RANK()``,
DENSE_RANK()``,
SUM()``,
AVG()
等。使用方式如下:
SELECT column,
ROW_NUMBER() OVER (PARTITION BY column ORDER BY column) as row_num
FROM table_name;
Step 3
Q:: 如何优化包含开窗函数的SQL查询?
A:: 优化包含开窗函数的SQL查询的方法有:
1.
确保正确的索引存在,特别是用于 PARTITION BY
和 ORDER BY
列。
2.
尽量减少数据集的大小,通过子查询或CTE先过滤掉不必要的数据。
3.
使用合适的分区和排序策略,避免全表扫描。
4.
避免在开窗函数中使用复杂的计算,尽可能提前计算好结果。
用途
开窗函数是现代SQL查询中非常重要的工具,尤其在数据分析和报表生成方面。面试这个内容是为了评估候选人对高级SQL功能的理解和应用能力。在实际生产环境中,这类查询常用于数据分析、用户行为追踪、时间序列数据处理等场景。例如,在用户行为分析中,我们经常需要找到每个用户的最新活动记录或者计算用户在一段时间内的行为累计值。\n相关问题
SQL 进阶查询面试题, 编写 SQL,使用开窗函数查询每个用户最近一次访问的页面路径及其访问日期
QA
Step 1
Q:: 编写 SQL,使用开窗函数查询每个用户最近一次访问的页面路径及其访问日期
A:: 可以使用ROW_NUMBER()窗口函数结合PARTITION BY和ORDER BY来实现。假设有一个表名为'user_logs',包含字段'user_id'(用户ID)、'page_path'(页面路径)和'visit_date'
(访问日期),SQL查询语句如下:
SELECT user_id, page_path, visit_date
FROM (
SELECT user_id, page_path, visit_date,
ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY visit_date DESC) AS rn
FROM user_logs
) t
WHERE rn = 1;
这个查询语句会返回每个用户最近一次访问的页面路径及其访问日期。
Step 2
Q:: 为什么开窗函数对查询操作非常重要?
A:: 开窗函数(如ROW_NUMBER, RANK, DENSE_RANK, SUM,
AVG等)允许我们在SQL查询中计算一些累积值、排名、或其他基于某些分组的数据操作,而不必进行复杂的子查询或使用临时表。它使得数据分析更加高效和简洁,是处理复杂查询需求的一个有力工具。
Step 3
Q:: ROW_NUMBER()和RANK()
的区别是什么?
A:: ROW_NUMBER()为每一行分配一个唯一的序号,按排序顺序递增,即使有相同的值也会赋予不同的序号。而RANK()
对于相同的排序值会赋予相同的排名,之后的排名会跳过。例如,如果有两个值为第一名,下一个排名会是第三名。
Step 4
Q:: PARTITION BY子句在开窗函数中的作用是什么?
A:: PARTITION BY子句用于将查询结果集划分成多个分区,然后在每个分区内应用窗口函数。如果省略PARTITION BY子句,则窗口函数会应用于整个结果集。这在处理类似'每个用户'、'每个分类'
这样需要对数据分组并在组内进行计算的场景中特别有用。
Step 5
Q:: 什么时候使用开窗函数而不是GROUP BY?
A:: 当你需要在不减少数据行的情况下计算聚合结果或累积值时,应该使用开窗函数。GROUP BY会将结果集按分组列聚合,而开窗函数则允许你在分组的基础上保留原始的详细数据。比如,你可能想要在每行数据上增加一个总和或排名列,而不丢失其他数据,这时开窗函数是最合适的。