百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

「数据分析面试」大厂高频SQL笔试题(一)

bigegpt 2024-09-20 14:02 4 浏览

更多数据分析思维、工具和面试面经请移步共粽号:【数据分析星球】

写在前面

秋高气爽,金桂飘香,十月份即将结束,对于求职的小伙伴们来说,“金九银十”已经接近尾声,不知道小伙伴们有没有找到自己心仪的工作呢?相信大多数的小伙伴都经历过数据分析的面试流程了,在数据分析的面试过程中,除了常规的业务问题外,还会重点考查数据分析的技术能力,这里就不得不提SQL了,SQL作为数据分析的笔试必考题,常常被用来检验候选人的技术水平,而且有些题目也是非常的刁钻,这对于初入职场的“小白”也是非常不友好。不过不用担心,结合自己多年的数据分析的求职和工作经验,我们接下来会有一系列文章,详细讲解数据分析面试中那些高频出现的SQL笔试题以及各大厂的SQL笔试题,学习了这些笔试题的常见套路和解法,把这些题目都刷一遍,在接下来的笔试中应该可以一往无前,势如破竹!,收割offer啦!

数据分析笔试中比较常考查的一个知识点就是行/列转换,以及一行/多行转换,因为在实际的业务中数据原本的存储方式可能不便于我们进行分析,所以我们需要进行行/列的转换,以及一行/多行的转换,这个转换过程非常常见也比较的tricky,所以也是数据分析面试中经常考查的内容!下面我们就通过实际的案例来进行讲解。

行/列转换

行/列转换在做数据分析时会经常遇到,所谓的行/列转换就是如下图所示两种展示形式的互相转换。

我们假设有4款产品ABCD,分别在三个电商平台天猫、淘宝和京东上进行销售,下表分别以两种形式记录了某个月各产品(Product)在各个平台(Platform)的销售数量(Quqntity)。我们为了分析的方便,需要对两种形式进行转换,也就是我们常说的行/列转换。


行转列

假如我们有下表,由Product、Platform、Quantity三个字段组成,但是为了方便展示,我们需要将Platform中的每一平台展示为一列,也就是行转列。


方法一:PIVOT

在SQL SERVER中,提供了专门进行行列转换的函数:PIVOT,PIVOT的一般语法是:

FROM table_source    -- 表名称,即数据源
    PIVOT(
    聚合函数(value_column)    -- value_column 要转换为 列值 的列名
    FOR pivot_column        -- pivot_column 指定要转换的列
    IN(column_list)        -- column_list 自定义的目标列名
)

使用PIVOT进行行转列的代码如下:

SELECT *
FROM table
PIVOT (
    SUM(quantity) FOR platform IN ('天猫','淘宝','京东')
)

通过上面 SQL 语句即可得到下面的结果:

PIVOT 后跟一个聚合函数SUM来拿到结果,FOR 后面跟的平台Platform是我们要转换的列,这样的话平台中的天猫、淘宝、京东就就被转换为列。IN 后面跟的就是具体的平台名称。


方法二:聚合函数+CASE WHEN

需要注意的是PIVOT是SQL SERVER的内置函数,对于行列转换非常方便,但Oracle、MySQL是不支持PIVOT函数的。我们可以用聚合函数配合CASE语句实现。使用 CASE WHEN 可以得到和 PIVOT 同样的结果,但是没有 PIVOT 简单直观。

SELECT Product,
  MAX(CASE WHEN Platform='天猫' THEN quantity ELSE 0 END) AS "天猫",
  MAX(CASE WHEN Platform='淘宝' THEN quantity ELSE 0 END) AS "淘宝",
  MAX(CASE WHEN Platform='京东' THEN quantity ELSE 0 END) AS "京东"
FROM table
GROUP BY Product


列转行

反过来,假设我们有下表 table,各个平台已经作为一列出现,我们需要将各个平台汇总为一列,也就是列转行。


方法一:UNPIVOT

与行转列类似,在SQL SERVER中,提供了列转行的函数:UNPIVOT,UNPIVOT的一般语法是:

FROM table_source    -- 表名称,即数据源
    UNPIVOT(
    value_column    -- value_column 要转换为 行值 的列名
    FOR pivot_column    -- pivot_column 指定要转换为指定的列
    IN(column_list )    -- column_list 目标列名
)

使用UNPIVOT进行列转行的代码如下:

SELECT *
FROM table
UNPIVOT (
    quantity FOR Platform IN ("天猫","淘宝","京东")
)

通过 UNPIVOT 可得到如下结果:


方法二:聚合函数+UNION

同理,Oracle,MySQL也是不支持UNPIVOT函数的,对于这种情况我们可以通过聚合函数+UNION的方式将数据组合起来。

SELECT
    Product,
    '天猫' AS Platform ,
    MAX("天猫") AS Quantity
FROM table GROUP BY Product
UNION
SELECT
    Product,
    '淘宝' AS Platform ,
    MAX("淘宝") AS Quantity
FROM table GROUP BY Product
UNION
SELECT
    Product,
    '京东' AS Platform ,
    MAX("京东") AS Quantity
FROM table GROUP BY Product


一行/多行转换

在数据分析中,还有一个非常常见的场景,就是需要将一行数据拓展为多行数据,或者将多行数据汇总为一行数据,这种一行/多行的数据转换问题也是面试中频繁考查的知识点之一,举例如下图所示。


一行转多行

原数据如下:table表中有两个字段,产品(Product)和供应商(Supplier),每个产品有多个供应商,各个供应商以逗号分割汇总为一行。现在需要将各个供应商分别展开为一行。

针对这种情况,Hive中提供了一个很高效的方法:lateral view和explode等函数一起使用,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,使用的时候需要注意:

  • 1、explode接受一个数组(或一个map)作为输入,并将数组元素(map)作为单独的行输出。UDTF可以在SELECT表达式列表中使用,也可以作为LATERAL VIEW的一部分使用。
  • 2、LATERAL VIEW是配合explode(或者其他的UDTF),把单行数据拆解成多行后的数据结果集。
  • 3、LATERAL VIEW explode要放置于from之后,where之前
SELECT DISTINCT Product,Supplier
FROM table
LATERAL VIEW explode (split(Supplier,',')) as t -- t为新表别名

拆成后结果:


多行转一行

反过来,我们想把多行再变回一行,需要怎么处理呢?我们可以使用:collect_set +concat_ws来实现。代码如下:

SELECT Product,concat_ws(',',collect_set(Supplier)) Product_Supplier
FROM table
GROUP BY Product

最终还原为一行数据如下:

注意:上述用的到的collect_set函数,有两个作用,第一个是去重,去除group by后的重复元素,

第二个是形成一个集合,将group by后属于同一组的集合起来成为一个集合。与contact_ws结合使用就是将这些元素以逗号分隔的形式形成字符串。

以上就是数据分析面试—SQL高频面试题部分的内容,部分数据分析文章请移步 共 粽 号【数据分析星球】,更多数据分析面试笔试的文章持续更新中,敬请期待,如果觉得不错,也欢迎分享、点赞哈~

相关推荐

pyproject.toml到底是什么东西?(py trim)

最近,在Twitter上有一个Python项目的维护者,他的项目因为构建失败而出现了一些bug(这个特别的项目不提供wheel,只提供sdist)。最终,发现这个bug是由于这个项目使用了一个pypr...

BDP服务平台SDK for Python3发布(bdp数据平台)

下载地址https://github.com/imysm/opends-sdk-python3.git说明最近在开发和bdp平台有关的项目,用到了bdp的python的sdk,但是官方是基于p...

Python-for-Android (p4a):(python-for-android p4a windows)

一、Python-for-Android(p4a)简介Python-for-Android(p4a),一个强大的开发工具,能够将你的Python应用程序打包成可在Android设备上运行...

Qt for Python—Qt Designer 概览

前言本系列第三篇文章(QtforPython学习笔记—应用程序初探)、第四篇文章(QtforPython学习笔记—应用程序再探)中均是使用纯代码方式来开发PySide6GUI应用程序...

Python:判断质数(jmu-python-判断质数)

#Python:判断质数defisPrime(n):foriinrange(2,n):ifn%i==0:return0re...

为什么那么多人讨厌Python(为什么python这么难)

Python那么棒,为什么那么多人讨厌它呢?我整理了一下,主要有这些原因:用缩进替代大括号许多人抱怨Python完全依赖于缩进来创建代码块,代码多一点就很难看到函数在哪里结束,那么你就需要把一个函数拆...

一文了解 Python 中带有 else 的循环语句 for-else/while-else

在本文中,我们将向您介绍如何在python中使用带有else的for/while循环语句。可能许多人对循环和else一起使用感到困惑,因为在if-else选择结构中else正常...

python的numpy向量化语句为什么会比for快?

我们先来看看,python之类语言的for循环,和其它语言相比,额外付出了什么。我们知道,python是解释执行的。举例来说,执行x=1234+5678,对编译型语言,是从内存读入两个shor...

开眼界!Python遍历文件可以这样做

来源:【公众号】Python技术Python对于文件夹或者文件的遍历一般有两种操作方法,一种是至二级利用其封装好的walk方法操作:import osfor root,d...

告别简单format()!Python Formatter类让你的代码更专业

Python中Formatter类是string模块中的一个重要类,它实现了Python字符串格式化的底层机制,允许开发者创建自定义的格式化行为。通过深入理解Formatter类的工作原理和使用方法,...

python学习——038如何将for循环改写成列表推导式

在Python里,列表推导式是一种能够简洁生成列表的表达式,可用于替换普通的for循环。下面是列表推导式的基本语法和常见应用场景。基本语法result=[]foriteminite...

详谈for循环和while循环的区别(for循环语句与while循环语句有什么区别)

初九,潜龙勿用在刚开始使用python循环语句时,经常会遇到for循环和while循环的混用,不清楚该如何选择;今天就对这2个循环语句做深入的分析,让大家更好地了解这2个循环语句以方便后续学习的加深。...

Python编程基础:循环结构for和while

Python中的循环结构包括两个,一是遍历循环(for循环),一是条件循环(while循环)。遍历循环遍历循环(for循环)会挨个访问序列或可迭代对象的元素,并执行里面的代码块。foriinra...

学习编程第154天 python编程 for循环输出菱形图

今天学习的是刘金玉老师零基础Python教程第38期,主要内容是python编程for循环输出菱形※。(一)利用for循环输出菱形形状的*号图形1.思路:将菱形分解为上下两个部分三角形图案,分别利用...

python 10个堪称完美的for循环实践

在Python中,for循环的高效使用能显著提升代码性能和可读性。以下是10个堪称完美的for循环实践,涵盖数据处理、算法优化和Pythonic编程风格:1.遍历列表同时获取索引(enumerate...