【每日一看】数据分析面试题归纳整理总结

刷题方向

目前看到的面经总结为分五大块:

  1. 统计理论知识
  2. 业务思维逻辑
  3. 机器学习、数据挖掘、工具类
  4. 算法编程、SQL
  5. 其他

可以参考link。当然还有一些自己从公众号以及自己刷题等总结添加到这里,从现在开始,会每天更新一些知识,按照与自己项目经历研究比较相关的知识开始添加,养成记录的好习惯,正如题目中的【每日一看】,能够真正做日日看,周周看,月月看,面试前一看,忘记了看一看。
本文其他参考链接:link

统计理论知识

描述性统计:

  1. 集中趋势:均值、中位数与分位数、众数
  2. 离中趋势:标准差、方差
  3. 数据分布:偏态与峰态、正态分布与三大分布
  4. 抽样理论:抽样误差、抽样精度

推断性统计:中心极限定理、大数定律、置信区间、假设检验、t检验、f检验、卡方检验、ABtest等等。

  • 贝叶斯公式复述并解释应用场景

P(A|B) = P(B|A)*P(A) / P(B) 如搜索query纠错,设A为正确的词,B为输入的词,那么:
P(A|B)表示输入词B实际为A的概率 P(B|A)表示词A错输为B的概率,可以根据AB的相似度计算(如编辑距离)
P(A)是词A出现的频率,统计获得 P(B)对于所有候选的A都一样,所以可以省去

  • 参数估计:

用样本统计量去估计总体的参数。分为点估计和区间估计两部分。link

  • 假设检验:

参数估计和假设检验是统计推断的两个组成部分,它们都是利用样本对总体进行某种推断,但推断的角度不同。
参数估计讨论的是用样本估计总体参数的方法,总体参数μ在估计前是未知的。
而在假设检验中,则是先对μ的值提出一个假设,然后利用样本信息去检验这个假设是否成立。
link

  • 男生点击率增加,女生点击率增加,总体为何减少?

因为男女的点击率可能有较大差异,同时低点击率群体的占比增大。
如原来男性20人,点击1人;女性100人,点击99人,总点击率100/120。
现在男性100人,点击6人;女性20人,点击20人,总点击率26/120。
即那个段子“A系中智商最低的人去读B,同时提高了A系和B系的平均智商。”

  • 置信度、置信区间

置信区间是我们所计算出的变量存在的范围,置信水平就是我们对于这个数值存在于我们计算出的这个范围的可信程度。
举例来讲,有95%的把握,真正的数值在我们所计算的范围里。 在这里,95%是置信水平,而计算出的范围,就是置信区间。 如果置信度为95%,
则抽取100个样本来估计总体的均值,由100个样本所构造的100个区间中,约有95个区间包含总体均值。link

  • 中心极限定理

中心极限定理定义:
(1)任何一个样本的平均值将会约等于其所在总体的平均值。
(2)不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的平均值周围,并且呈正态分布。
中心极限定理作用:
(1)在没有办法得到总体全部数据的情况下,我们可以用样本来估计总体。
(2)根据总体的平均值和标准差,判断某个样本是否属于总体。
link

  • A/B test 定义,原理,目的,流程,统计学知识。

A和B两个设计方案分别展示给两个用户群体(样本足够大,足够有代表性)。通过最终结果找出最优的那一个。本质是一种多变量实验,允许同时对多个测试点进行测试。
独立,关键点:明确测试目标,A/B两个被测方案,展示用户群尽量大。快速做出方案决策。
目的:可以用来演示新功能对用户体验变化的影响。
流程:确定目标,创建变体,生成假设,收集数据,运行实验,分析结果。(有时候可能无法用分析来解释测试结果,不应忘记探寻理由)
统计学知识:核心:假设检验。

  • 协方差与相关系数的区别和联系。

协方差: 协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。
如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。
如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
相关系数:
研究变量之间线性相关程度的量,取值范围是[-1,1]。相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。
可参考link

  • p值的含义。

基本原理只有3个:
1、一个命题只能证伪,不能证明为真
2、在一次观测中,小概率事件不可能发生
3、在一次观测中,如果小概率事件发生了,那就是假设命题为假
证明逻辑就是:我要证明命题为真->证明该命题的否命题为假->在否命题的假设下,观察到小概率事件发生了->否命题被推翻->原命题为真->搞定。
结合这个例子来看:证明A是合格的投手-》证明“A不是合格投手”的命题为假-》观察到一个事件(比如A连续10次投中10环),而这个事件在“A不是合格投手”的假设下,概率为p,小于0.05->小概率事件发生,否命题被推翻。
可以看到p越小-》这个事件越是小概率事件-》否命题越可能被推翻-》原命题越可信link

  • 朴素贝叶斯的理解

理解:朴素贝叶斯是在已知一些先验概率的情况下,由果索因的一种方法
其它:朴素的意思是假设了事件相互独立

业务思维逻辑

从‘人人都是产品经理’社区、增长黑客等内容学习,最少要知道Pv、Uv、DAU等各种指标,如何进行指标拆解、如何进行流量分析、留存分析、用户行为分析,啥是海盗模型,RFM模型、某个指标下降/上升如何分析等等。

  • 用户流失的分析,新用户流失和老用户流失有什么不同?

(1)用户流失分析:
两层模型:细分用户、产品、渠道,看到底是哪里用户流失了。注意由于是用户流失问题,所以这里细分用户时可以细分用户处在生命周期的哪个阶段。
指标拆解:用户流失数量 =该群体用户数量*流失率。拆解,看是因为到了这个阶段的用户数量多了(比如说大部分用户到了衰退期),还是这个用户群体的流失率比较高 内外部分析:
a. 内部:新手上手难度大、收费不合理、产品服务出现重大问题、活动质量低、缺少留存手段、用户参与度低等
b.外部:市场、竞争对手、社会环境、节假日等 (2)新用户流失和老用户流失有什么不同:
新用户流失:原因可能有非目标用户(刚性流失)、产品不满足需求(自然流失)、产品难以上手(受挫流失)和竞争产品影响(市场流失)。
新用户要考虑如何在较少的数据支撑下做流失用户识别,提前防止用户流失,并如何对有效的新用户进行挽回。
老用户流失:原因可能有到达用户生命周期衰退期(自然流失)、过度拉升arpu导致低端用户驱逐(刚性流失)、社交蒸发难以满足前期用户需求(受挫流失)和竞争产品影响(市场流失)。
老用户有较多的数据,更容易进行流失用户识别,做好防止用户流失更重要。当用户流失后,要考虑用户生命周期剩余价值,是否需要进行挽回。
link

  • 业务场景题,如何分析次日留存率下降的问题
  1. 两层模型
    从用户画像、渠道、产品、行为环节等角度细分,明确到底是哪里的次日留存率下降了
  2. 指标拆解 次日留存率 = Σ 次日留存数 / 今日获客人数
  3. 原因分析
    内部: 运营活动 产品变动 技术故障 设计漏洞(如产生可以撸羊毛的设计)
    外部: 竞品 用户偏好 节假日 社会事件(如产生舆论)
  • 处理需求时的一般思路是什么,并举例

明确需求,
需求方的目的是什么
拆解任务
制定可执行方案
推进
验收

  • 网站流量指标

曝光率
页面浏览数(PV)
独立访客数(UV)
重复访客数(RV)
日活跃用户(DAU)
PV、UV点击率
跳出、完成、回购率

机器学习、数据挖掘、工具类

理解每个算法的应用背景,优缺点(最重要的)。熟悉的常见公式推导。大致要掌握的是逻辑回归、SVM、决策树、随机森林、Adboost、XGboost等集成学习、神经网络。

  • 常用的Python库有哪些?

numpy:矩阵运算
sklearn:常用机器学习和数据挖掘工具库
scipy:基于numpy做高效的数学计算,如积分、线性代数、稀疏矩阵等
pandas:将数据用表的形式进行操作
matplotlib:数据可视化工具
seaborn:数据可视化工具
keras/tensorflow/theano:深度学习工具包
NLTK:自然语言处理工具包
beautifulsoap:网页文档解析工具

  • K-Means算法原理:

在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。

  • 数据预处理过程有哪些?

缺失值处理:删、插
异常值处理 特征转换:时间特征sin化表示
标准化:最大最小标准化、z标准化等
归一化:对于文本或评分特征,不同样本之间可能有整体上的差异,如a文本共20个词,b文本30000个词,b文本中各个维度上的频次都很可能远远高于a文本
离散化:onehot、分箱等

  • PCA(主成分分析):

主成分分析是一种降维的方法
思想是将样本从原来的特征空间转化到新的特征空间,并且样本在新特征空间坐标轴上的投影方差尽可能大,这样就能涵盖样本最主要的信息 方法: a.
特征归一化 b. 求样本特征的协方差矩阵A c. 求A的特征值和特征向量,即AX=λX d.
将特征值从大到小排列,选择topK,对应的特征向量就是新的坐标轴(采用最大方差理论解释,参考:link
PCA也可以看成激活函数为线性函数的自动编码机(参考林轩田的《机器学习基石》第13课,深度学习)

  • hive?spark?sql? nlp?

Hive允许使用类SQL语句在hadoop集群上进行读、写、管理等操作
Spark是一种与hadoop相似的开源集群计算环境,将数据集缓存在分布式内存中的计算平台,每轮迭代不需要读取磁盘的IO操作,从而答复降低了单轮迭代时间。

  • Linux基本命令:

目录操作:ls、cd、mkdir、find、locate、whereis等
文件操作:mv、cp、rm、touch、cat、more、less
权限操作:chmod+rwx421
账号操作:su、whoami、last、who、w、id、groups等
查看系统:history、top
关机重启:shutdown、reboot
vim操作:i、w、w!、q、q!、wq等

  • sql中null与‘ ’的区别:

null表示空,用is null判断
’ ‘表示空字符串,用=’'判断

  • 数据库与数据仓库的区别。

简单理解下数据仓库是多个数据库以一种方式组织起来 数据库强调范式,尽可能减少冗余
数据仓库强调查询分析的速度,优化读取操作,主要目的是快速做大量数据的查询 数据仓库定期写入新数据,但不覆盖原有数据,而是给数据加上时间戳标签
数据库采用行存储,数据仓库一般采用列存储
数据仓库的特征是面向主题、集成、相对稳定、反映历史变化,存储数历史数据;数据库是面向事务的,存储在线交易数据
数据仓库的两个基本元素是维表和事实表,维是看待问题的角度,比如时间、部门等,事实表放着要查询的数据

  • SQL的数据类型。

字符串:char、varchar、text
二进制串:binary、varbinary
布尔类型:boolean
数值类型:integer、smallint、bigint、decimal、numeric、float、real、double
时间类型:date、time、timestamp、interval

  • 什么是聚类分析?聚类算法有哪几种?请选择一种详细描述其计算原理和步骤。

聚类分析是一种无监督的学习方法,根据一定条件将相对同质的样本归到一个类总。
聚类方法主要有:
a. 层次聚类
b. 划分聚类:kmeans
c. 密度聚类
d. 网格聚类
e. 模型聚类:高斯混合模型
k-means比较好介绍,选k个点开始作为聚类中心,然后剩下的点根据距离划分到类中;找到新的类中心;重新分配点;迭代直到达到收敛条件或者迭代次数。
优点是快;缺点是要先指定k,同时对异常值很敏感。

  • 谱聚类:

谱聚类是一种基于图论的聚类方法,主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远(或者相似度较低)的两个点之间的边权重值较低,而距离较近(或者相似度较高)的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。link

  • 如何避免过拟合?

过拟合表现在训练数据上的误差非常小,而在测试数据上误差反而增大。其原因一般是模型过于复杂,过分得去拟合数据的噪声和outliers。常见的解决办法是正则化:增大数据集,正则化,交叉验证。

  • 解释一下正则化是什么,它为什么非常有用?

正则化就是为模型添加调整参数的过程,目的是为了防止过拟合(overfit),增加平滑度。通常会以向现有的权向量(weight
vector)添加常倍数的方式来完成。这个常数一般为L1(Lasso)或者L2(ridge),但实际上可以是任何形式的。
在修改后的模型中,从正则化训练集得出的损失函数,平均值应当降至最低。

  • 解释协同过滤是什么?

协同过滤是一种基于用户行为数据创建推荐系统的简单算法。协同过滤最重要的组件是用户对项目的兴趣。
协同过滤一个很好的例子就是购物网站上出现的类似“为您推荐”的模块,该模块通常会获取用户的浏览记录信息,以弹出用户可能喜欢或需要的商品。

  • 什么是推荐引擎? 它是如何工作的?

我们都熟悉Netflix的推荐系统,这样的系统被称为推荐引擎或更广泛的推荐系统. 他们通常以两种方式产生推荐:协同过滤或基于内容过滤.
协同过滤算法基于用户过去行为(之前购买物品,观看电影,评分等等)建立模型,对当前或其他用户做决策.模型用于预测用户可能喜欢的物品(物品评分).
基于内容过滤方法使用一个物品特征推荐额外具有相似属性的物品.这些方法通常在混合推荐系统中组合使用.

  • 如何避免决策树过拟合

限制树深
剪枝
限制叶节点数量
正则化项
增加数据
bagging(subsample、subfeature、低维空间投影)
数据增强(加入有杂质的数据)
早停

  • SVM的优缺点

优点: 能应用于非线性可分的情况
最后分类时由支持向量决定,复杂度取决于支持向量的数目而不是样本空间的维度,避免了维度灾难
具有鲁棒性:因为只使用少量支持向量,抓住关键样本,剔除冗余样本
高维低样本下性能好,如文本分类
缺点: 模型训练复杂度高
难以适应多分类问题
核函数选择没有较好的方法论

  • 数据缺失怎么办

删除样本或删除字段
用中位数、平均值、众数等填充
插补:同类均值插补、多重插补、极大似然估计
用其它字段构建模型,预测该字段的值,从而填充缺失值(注意:如果该字段也是用于预测模型中作为特征,那么用其它字段建模填充缺失值的方式,并没有给最终的预测模型引入新信息)
onehot,将缺失值也认为一种取值
压缩感知及矩阵补全

  • 数据清理中,处理缺失值的方法是?
    由于调查、编码和录入误差,数据中可能存在一些无效值和缺失值,需要给予适当的处理。常用的处理方法有:估算,整例删除,变量删除和成对删除。

估算(estimation)。
最简单的办法就是用某个变量的样本均值、中位数或众数代替无效值和缺失值。这种办法简单,但没有充分考虑数据中已有的信息,误差可能较大。另一种办法就是根据调查对象对其他问题的答案,通过变量之间的相关分析或逻辑推论进行估计。例如,某一产品的拥有情况可能与家庭收入有关,可以根据调查对象的家庭收入推算拥有这一产品的可能性。
整例删除(casewise deletion)是剔除含有缺失值的样本。
由于很多问卷都可能存在缺失值,这种做法的结果可能导致有效样本量大大减少,无法充分利用已经收集到的数据。因此,只适合关键变量缺失,或者含有无效值或缺失值的样本比重很小的情况。
变量删除(variable deletion)。
如果某一变量的无效值和缺失值很多,而且该变量对于所研究的问题不是特别重要,则可以考虑将该变量删除。这种做法减少了供分析用的变量数目,但没有改变样本量。
成对删除(pairwise deletion)是用一个特殊码(通常是9、99、999等)代表无效值和缺失值,同时保留数据集中的全部变量和样本。但是,在具体计算时只采用有完整答案的样本,因而不同的分析因涉及的变量不同,其有效样本量也会有所不同。这是一种保守的处理方法,最大限度地保留了数据集中的可用信息。

算法编程、SQL

  • 统计教授多门课老师数量并输出每位老师教授课程数统计表

设表class中字段为id,teacher,course

  1. 统计教授多门课老师数量
select count(*) from class
group by teacher having count(*) > 1
  1. 输出每位老师教授课程数统计
select teacher, count(course) as count_course
from class
group by teacher
  • 四个人选举出一个骑士,统计投票数,并输出真正的骑士名字
select knight from table
group by vote_knight
order by count(vote_knight) limit 1
  • 现有一个数据库表Tourists,记录了某个景点7月份每天来访游客的数量如下:id date visits 1 2017-07-01 100 …… 非常巧,id字段刚好等于日期里面的几号。现在请筛选出连续三天都有大于100天的日期。上面例子的输出为:date 2017-07-01 ……
select t1.date
from Tourists as t1, Tourists as t2, Tourists as t3
on t1.id = (t2.id+1) and t2.id = (t3.id+1)
where t1.visits >100 and t2.visits>100 and t3.visits>100
  • 员工表,宿舍表,部门表,统计出宿舍楼各部门人数表
    设:
    员工表为employee,字段为id,employee_name,belong_dormitory_id,belong_department_id;
    宿舍表为dormitory,字段为id,dormitory_number;
    部门表为department,字段为id,department_name
select dormitory_number, department_name, count(employee_name) as count_employee
from employee as e
left join dormitory as dor on e.belong_dormitory_id = dor.id
left join department as dep on e.belong_department_id = dep.id
  • count(*)、count(1)、count(column_name)的区别
  1. count(*)所有行进行统计,包含值为null的行。
  2. count(column)会对指定列具有的行数进行统计,除去值为NULL的行。
  3. count(1)与count(*) 的效果是一样的。
  • 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
    (注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面)
    CREATE TABLE employees (
    emp_no int(11) NOT NULL,
    birth_date date NOT NULL,
    first_name varchar(14) NOT NULL,
    last_name varchar(16) NOT NULL,
    gender char(1) NOT NULL,
    hire_date date NOT NULL comment ‘入职时间’,
    PRIMARY KEY (emp_no));
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL comment ‘一条薪水记录开始时间’,
    to_date date NOT NULL comment ‘一条薪水记录结束时间’,
    PRIMARY KEY (emp_no,from_date));

1.找出每个员工当前工资
2.找出每个员工入职时的工资
3.结合找出growth

select e.emp_no, s_cur.salary - s_str.salary as growth
from employees as e 
inner join salaries as s_cur on e.emp_no = s_cur.emp_no
and s_cur.to_date='9999-01-01'
inner join salaries as s_str on e.emp_no = s_str.emp_no
and e.hire_date = s_str.from_date
order by growth asc
  • 对所有员工的当前(to_date=‘9999-01-01’)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,from_date));
    在这里插入图片描述

1、从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = ‘9999-01-01’,挑选出当前所有员工的薪水情况。
2、本题的精髓在于 s1.salary <= s2.salary,意思是在输出s1.salary的情况下,有多少个s2.salary大于等于s1.salary,比如当s1.salary=94409时,有3个s2.salary(分别为94692,94409,94409)大于等于它,但由于94409重复,利用COUNT(DISTINCT s2.salary)去重可得工资为94409的rank等于2。其余排名以此类推。
3、千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),因为用了合计函数COUNT()
4、最后先以 s1.salary 逆序排列,再以 s1.emp_no 顺序排列输出结果

select s1.emp_no, s1.salary, count(distinct s2.salary) as rank 
from salaries as s1, salaries as s2
where s1.to_date='9999-01-01'
and s2.to_date='9999-01-01'
and s1.salary <= s2.salary
group by s1.emp_no
order by s1.salary desc, s1.emp_no asc

  • 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date=‘9999-01-01’
    CREATE TABLE dept_emp (
    emp_no int(11) NOT NULL,
    dept_no char(4) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,dept_no));
    CREATE TABLE dept_manager (
    dept_no char(4) NOT NULL,
    emp_no int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,dept_no));
    CREATE TABLE employees (
    emp_no int(11) NOT NULL,
    birth_date date NOT NULL,
    first_name varchar(14) NOT NULL,
    last_name varchar(16) NOT NULL,
    gender char(1) NOT NULL,
    hire_date date NOT NULL,
    PRIMARY KEY (emp_no));
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,from_date));

不等于对应的是一个具体指,而not in是对应的多个值
1、先用INNER JOIN连接employees和salaries,找出当前所有员工的工资情况
2、再用INNER JOIN连接dept_emp表,找到所有员工所在的部门 3、最后用限制条件de.emp_no NOT IN (SELECT emp_no FROM dept_manager WHERE to_date = ‘9999-01-01’)选出当前所有非manager员工,再依次输出dept_no、emp_no、salary

select d.dept_no, s.emp_no, s.salary
from (employees as e inner join salaries as s
      on e.emp_no = s.emp_no
      and s.to_date='9999-01-01')
inner join dept_emp as d
on e.emp_no = d.emp_no
where d.emp_no not in 
    (select dm.emp_no 
     from dept_manager as dm 
     where dm.to_date='9999-01-01')
  • 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01’,
    结果第一列给出员工的emp_no,
    第二列给出其manager的manager_no,
    第三列给出该员工当前的薪水emp_salary,
    第四列给该员工对应的manager当前的薪水manager_salary
    CREATE TABLE dept_emp (
    emp_no int(11) NOT NULL,
    dept_no char(4) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,dept_no));
    CREATE TABLE dept_manager (
    dept_no char(4) NOT NULL,
    emp_no int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,dept_no));
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,from_date));

这种场景,最重要的是学会拆分,把复杂的查询分成一个个简单的查询,最后再将其组合在一起,这便是分合的思想。
先查出员工的工号和薪水:
再查出经理的工号和薪水:
接着就是组合,看准条件,做好条件衔接:

select de.emp_no, dm.emp_no as manager_no, s_emp.salary as emp_salary, s_manager.salary as manager_salary
from dept_emp as de ,salaries as s_emp, dept_manager as dm, salaries as s_manager
where de.emp_no = s_emp.emp_no
and de.to_date='9999-01-01'
and s_emp.to_date='9999-01-01'
and dm.emp_no = s_manager.emp_no
and dm.to_date='9999-01-01'
and s_manager.to_date='9999-01-01'
and de.dept_no = dm.dept_no
and s_emp.salary > s_manager.salary
  • 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
    提示:在sqlite中获取datetime时间对应的年份函数为strftime(’%Y’, to_date)
    CREATE TABLE salaries (
    emp_no int(11) NOT NULL,
    salary int(11) NOT NULL,
    from_date date NOT NULL,
    to_date date NOT NULL,
    PRIMARY KEY (emp_no,from_date));
select s1.emp_no, s2.from_date, (s2.salary - s1.salary) as salary_growth
from salaries as s1, salaries as s2
where s1.emp_no = s2.emp_no
and s2.salary - s1.salary >5000
and strftime('%Y', s2.to_date) - strftime('%Y', s1.to_date)=1
order by salary_growth desc

其他

  • hadoop原理和mapreduce原理
  1. Hadoop原理
    采用HDFS分布式存储文件,MapReduce分解计算,其它先略
  2. MapReduce原理
    map阶段:读取HDFS中的文件,解析成<k,v>的形式,并对<k,v>进行分区(默认一个区),将相同k的value放在一个集合中
    reduce阶段:将map的输出copy到不同的reduce节点上,节点对map的输出进行合并、排序

猜你喜欢

转载自blog.csdn.net/weixin_43835470/article/details/106343512