# 大厂SQL面试题整理汇总

By [0xFF00FF](https://paragraph.com/@0xff00ff) · 2024-03-16

---

> 以下 SQL 的执行环境为 HIVE 环境

0x01 面试 SQL 函数考点
----------------

一般围绕开窗函数做文章，首先我们了解下有哪些常用的开窗函数

函数名                    作用简介

待补充

0x02 数据集构造
----------

用户登录数据集：user\_name 是用户名, login\_date 是用户登录日期

![登录数据集示例](https://storage.googleapis.com/papyrus_images/ac2370cc05cfedf608782192d5f521197c6afcad652daa583ed82605fcaa5ca5.png)

登录数据集示例

每日订单数据集

0x03 面试 SQL 实例（来自互联网）
---------------------

1.  找出连续7天登陆，连续30天登陆的用户（`小红书笔试`），最大连续登陆天数的问题 --窗口函数
    

思路解答：

*   假设数据集中用户在一天登录一次不重复，对于一个用户登录的天数做递增排序。
    
*   每天的登录日期减去登录的第几次，找到对应的连续登录的第一天
    
*   在用户维度对连续登录的第一天做计数过滤，得到对应连续登录的清单。
    
        SELECT  user_name
               ,first_day
               ,COUNT(1) AS cnt
        FROM
        (
            SELECT  *
                   ,date_sub(to_date(login_date, "yyyy/mm/dd"),rn) AS first_day
            FROM
            (
                SELECT  *
                       ,ROW_NUMBER() over(PARTITION BY user_name ORDER BY  login_date ASC) AS rn
                       from jd_test
            ) AS T
        ) AS T1
        GROUP BY  user_name
                 ,first_day
        HAVING cnt >= 2 -- 具体天数;
        
    

![对应结果返回示例](https://storage.googleapis.com/papyrus_images/7f0b1f0c548ade5bf5acaf0889a6525f39016a88bd8496eca8b6dcd454021e88.png)

对应结果返回示例

1.  有一张订单，需要每日汇总期初到现阶段所有的成交金额（$$字节面试题$$）-- 窗口函数
    

![](https://storage.googleapis.com/papyrus_images/3dd53a139dbb4be92ed13f3c78e207d90cc5ccfc7698b5b008b4cc99bf503ccf.png)

    -- 订单金额，每日累计求和
    SELECT  *
           ,SUM(gmv) over(order by id)
    FROM
    (
        SELECT  id
               ,SUM(gmv) AS gmv
        FROM jd_test4
        GROUP BY  id
    ) AS T;

---

*Originally published on [0xFF00FF](https://paragraph.com/@0xff00ff/sql)*
