看看你离世界一流大厂有多远?3道Google最新SQL面试题 ⛵

简介: 朋友刚刚拿到了 Google 数据分析师的 Offer!跟她详聊了面试的3道SQL题目,把思路和参考答案一并奉上!各位近期在面试的朋友,可以拿来自测一下~【代码与数据集亲测可运行】
5d9a42b143ac45868bf3f2813dcb99f3~tplv-k3u1fbpfcp-zoom-1.image
💡 作者: 韩信子@ ShowMeAI
📘 数据分析◉技能提升系列https://www.showmeai.tech/tutorials/33
📘 AI 面试题库系列https://www.showmeai.tech/tutorials/48
📘 本文地址https://www.showmeai.tech/article-detail/297
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏 ShowMeAI查看更多精彩内容

下面是最新的 3 道 Google SQL 面试题和参考答案。这些题目面向的 Google 职位包括:数据科学 数据分析师商业智能 工程师数据工程师商业分析师

ecaea49dcd264479ab3c47389110ba3c~tplv-k3u1fbpfcp-zoom-1.image

ShowMeAI 制作了快捷即查即用的 SQL 速查表手册,大家可以在下述位置获得:

💡 面试题 1:墨西哥和美国第三高峰

b41c1af6e90f4140991c058a8cf1c815~tplv-k3u1fbpfcp-zoom-1.image

问题: 请完成1个 SQL 来找出每个国家第三高的山名,并按 ASC 顺序对国家/地区排序。

Table: mountains
+---------------------+------+-------------+
|name                 |height|country      |
+---------------------+------+-------------+
|Denalli              |20310 |United States|
|Saint Elias          |18008 |United States|
|Foraker              |17402 |United States|
|Pico de Orizab       |18491 |Mexico       |
|Popocatépetl         |17820 |Mexico       |
|Iztaccihuatl         |17160 |Mexico       |
+---------------------+------+-------------+

参考答案:

SELECT "country",
       "name"
FROM   (SELECT "country",
               "name",
               Rank()
                 OVER (
                   partition BY "country"
                   ORDER BY "height" DESC) AS "rank"
        FROM   mountains) AS m
WHERE  "rank" = 3
ORDER  BY country ASC 

💡 面试题 2:用 latest_event 查找当前打开的页数

78959118a3624620806092cbb721b354~tplv-k3u1fbpfcp-zoom-1.image

问题: 给定下表,表中包含有关页面状态更改时间的信息。完成 SQL 查找当前使用 latest_event 的页面数。 注意,表中 page_flag 列将用于识别页面是『OFF』还是『ON』。

Table: pages_info
+-------+--------------------------------------+----------+
|page_id|event_time                            |page_flag |
+-------+--------------------------------------+----------+
|1      |current_timestamp - interval '6 hours'|ON        |
|1      |current_timestamp - interval '3 hours'|OFF       |
|1      |current_timestamp - interval '1 hours'|ON        |
|2      |current_timestamp - interval '3 hours'|ON        |
|2      |current_timestamp - interval '1 hours'|OFF       |
|3      |current_timestamp                     |ON        |
+-------+--------------------------------------+----------+

参考答案:

-- 首先,对于每个页面ID,让我们选择最新的记录(基于事件时间列)。
SELECT page_id,
       Max(event_time) AS latest_event
FROM   pages_info
GROUP  BY page_id 

-- 接着,我们将前面的查询与原表连接起来,并检查其中有多少人的标记页等于ON。
WITH latest_event
     AS (SELECT page_id,
                Max(event_time) AS latest_event
         FROM   pages_info
         GROUP  BY page_id)
SELECT Sum(CASE
             WHEN page_flag = 'ON' THEN 1
             ELSE 0
           END) AS result
FROM   pages_info pi
       JOIN latest_event le
         ON pi.page_id = le.page_id
            AND pi.event_time = le.latest_event; 

💡 面试题 3:回访用户

e66852eaa8fd4767a2449283546c0b80~tplv-k3u1fbpfcp-zoom-1.image

问题: 在如下的数据库表中,包含有关用户访问网页的信息。 完成 SQL 返回连续访问该页面最长的 3 个用户,按长短的倒序排列 3 个用户。

Table: visits
+--------+----------------------------+
|user_id |date                        | 
+--------+----------------------------+
|1       |current_timestamp::DATE - 0 |
|1       |current_timestamp::DATE - 1 |
|1       |current_timestamp::DATE - 2 |
|1       |current_timestamp::DATE - 3 |
|1       |current_timestamp::DATE - 4 |
|2       |current_timestamp::DATE - 1 |
|4       |current_timestamp::DATE - 0 |
|4       |current_timestamp::DATE - 1 |
|4       |current_timestamp::DATE - 3 |
|4       |current_timestamp::DATE - 4 |
|4       |current_timestamp::DATE - 62|   
+--------+----------------------------+

参考答案:

--首先,让我们添加一个新的列,其值是每个用户的下一次访问(与当前日期不同)。我们将使用lead函数来完成:
SELECT DISTINCT user_id,
                date,
                Lead(date)
                  OVER (
                    partition BY user_id
                    ORDER BY date) AS next_date
FROM   (SELECT DISTINCT *
        FROM   visits) AS t; 
--接着,让我们创建另一个列,其目的是让我们知道访问的停止。这包括检查下一个日期是否与当前日期+1是否不同。
WITH next_dates
     AS (SELECT DISTINCT user_id,
                         date,
                         Lead(date)
                           OVER (
                             partition BY user_id
                             ORDER BY date) AS next_date
         FROM   (SELECT DISTINCT *
                 FROM   visits) AS t) --去重
SELECT user_id,
       date,
       next_date,
       CASE
         WHEN next_date IS NULL
               OR next_date = date + 1 THEN 1
         ELSE NULL
       END AS streak
FROM   next_dates; 
--接着,我们将为每个用户创建一个分区,每个分区代表一个连续的访问。从概念上讲,我们要做的是,对于每个用户,取最近的记录(基于日期)并赋值为0,然后寻找下面的记录,如果访问没有停止就赋值为0,如果访问停止就赋值为1(如果连胜列为空),然后继续这样做,直到每个连续访问被一个不同的分区所代表。执行这一逻辑的代码如下。
WITH next_dates
     AS (SELECT DISTINCT user_id,
                         date,
                         Lead(date)
                           OVER (
                             partition BY user_id
                             ORDER BY date) AS next_date
         FROM   (SELECT DISTINCT *
                 FROM   visits)),
     streaks
     AS (SELECT user_id,
                date,
                next_date,
                CASE
                  WHEN next_date IS NULL
                        OR next_date = date + 1 THEN 1
                  ELSE NULL
                END AS streak
         FROM   next_dates)
SELECT *,
       Sum(CASE
             WHEN streak IS NULL THEN 1
             ELSE 0
           END)
         OVER (
           partition BY user_id
           ORDER BY date) AS partition
FROM   streaks; 
--一旦我们有了这个分区,问题就容易了,现在我们只需要计算每个用户和分区的记录数,并找到计数最多的用户。完整的查询如下
WITH next_dates AS
(
                SELECT DISTINCT user_id,
                                date,
                                Lead(date) OVER (partition BY user_id ORDER BY date) AS next_date
                FROM            visits ), streaks AS
(
       SELECT user_id,
              date,
              next_date,
              CASE
                     WHEN next_date IS NULL
                     OR     next_date = date + 1 THEN 1
                     ELSE NULL
              END AS streak
       FROM   next_dates ), partitions AS
(
         SELECT   *,
                  Sum(
                  CASE
                           WHEN streak IS NULL THEN 1
                           ELSE 0
                  END ) OVER (partition BY user_id ORDER BY date) AS partition
         FROM     streaks ), count_partitions AS
(
         SELECT   user_id,
                  partition,
                  Count(1) AS streak_days
         FROM     partitions
         GROUP BY user_id,
                  partition )
SELECT   user_id,
         Max(streak_days) AS longest_streak
FROM     count_partitions
GROUP BY user_id
ORDER BY 2 DESC limit 3;

参考资料

e9190f41b8de4af38c8a1a0c96f0513b~tplv-k3u1fbpfcp-zoom-1.image

目录
相关文章
|
4月前
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
7月前
|
SQL 关系型数据库 MySQL
MYSQL-SQL语句性能优化策略以及面试题
MYSQL-SQL语句性能优化策略以及面试题
141 1
|
4月前
|
SQL
sql面试50题------(1-10)
这篇文章提供了SQL面试中的前10个问题及其解决方案,包括查询特定条件下的学生信息、教师信息和课程成绩等。
sql面试50题------(1-10)
|
15天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
4月前
|
SQL
sql面试50题------(11-20)
这篇文章提供了SQL面试中的50道题目,其中详细解释了11至20题,包括查询与学号为“01”的学生所学课程相同的学生信息、不及格课程的学生信息、各科成绩统计以及学生的总成绩排名等问题的SQL查询语句。
|
4月前
|
SQL
sql面试50题------(21-30)
这篇文章是SQL面试题的21至30题,涵盖了查询不同老师所教课程的平均分、按分数段统计各科成绩人数、查询学生平均成绩及其名次等问题的SQL查询语句。
sql面试50题------(21-30)
|
5月前
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
53 1
|
6月前
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
6月前
|
SQL 关系型数据库 MySQL
sql面试题库
sql面试题库
|
5月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
67 0
下一篇
无影云桌面