以下介绍常用的SQL写法:

case when的用法---不管偏不偏,你可能真没见过这种写法

内连接VS左连接---80%的业务代码都与之相关

distinct的用法--你可能真的错怪distinct了

order by的注意事项---order by一般放在主查询后,子查询无效!

group by---新手小白,总是group by时报错!

having--having有时真的很牛逼

topN问题---分组取最大,分组取前几

标准SQL与基于hive的SQL---最常见的区别

不得不知的聚合函数---数据库中的聚合函数真的比excel快很多!

SQL优化--路漫漫其修远兮……

做需求写SQL需要注意的问题---一家之言

case when

1、不同的岗位调不同等级的薪水;

select last_name,job_id,salary,case job_idwhen 'IT_PROG' then 1.1*salary when 'ST_CLERK' then 1.15*salary when 'SA_REP' then 1.2*salary else salary end
“zhangngongzi”
from employees;

2、行列转换之case when

select deptno,sum(clerk) as clerk ,sum(salesman) as salesman ,sum(manager) as manager,sum(analyst) as analyst ,sum(president) as president
from
(select deptno,case job when 'CLERK' THEN SAL  end as  clerk, case job WHEN 'SALESMAN' THEN SAL  end as salesman, case job WHEN 'MANAGER' THEN SAL  end as manager,
case job WHEN 'ANALYST' THEN SAL   end as analyst,
case job WHEN 'PRESIDENT' THEN SAL  END as president   FROM EMP ) group by deptno;

顺便提一下SQL语句的执行顺序:from--where---group by--having--select --distinct ---order by --limit

加上多表连接后,执行顺序:先执行子查询,再执行主查询;先对两个表执行笛卡尔乘积--join--where---group by--having--select --distinct ---order by --limit

带Left Join的SQL语句的执行顺序

最终实现的效果:

3、当你想得到多个指标的数据,又不想写多条语句,那么case when 可以帮到你:

create table qiuzhiliao as select week_begin_date_id,u_user,(case when channel = 'oppokeke' then  'oppokeke'when channel = 'huawei' then  'huawei'when channel = 'xiaomi' then 'xiaomi'when channel = 'yingyongbao' then  'yingyongbao'when channel = 'yingyongbaozx' then  'yingyongbaozx'when channel = 'AppStore' then  'AppStore'when channel = 'baidu' then  'baidu'--when channel = '360zhushou' then channel ='360zhushou'when channel = 'wandoujia'  then 'wandoujia'when channel like 'bdsem%' then 'bdsem'when channel like 'sgsem%' then 'sgsem'when channel like 'smsem%' then 'smsem'else '360zhushou'end ) AS channelfrom tmp.qzl_1where (channel in ('oppokeke','huawei','xiaomi','yingyongbao','yingyongbaozx','AppStore','baidu','360zhushou','wandoujia')
or channel like 'bdsem%'
or channel like 'sgsem%'
or channel like 'smsem%')select week_begin_date_id,channel ,count (distinct u_user)from qiuzhiliao
group by week_begin_date_id,channel
order by week_begin_date_id,channel

这样可以将具有相同特征信息的聚成一类,然后统计这类的数据;
case 字段 when 条件 then =case when 字段 =条件 then ;

4、case when完成多条件统计

select zc.stab,sum(case when toppop>10000 then 1 else  0 end ) as num_10000,--sum(case when toppop>10000 then 1  end ) as num_10000sum(case when toppop >1000 then 1 else 0 end) as num_10000
from ZipCensus  zc
group by zc.stab

toppop>10000的计数统计为num_10000,toppop>1000的计数统计为num_1000;---case when 完成多条件统计;上面注释行:当不满足条件时返回null,第一个case when不满足条件时,返回0;通常在计数时,推荐返回值返回数字而不是null!并且在聚合函数中使用case when,适用的函数sum()或max(),avg(),很少情况使用count(distinct ).

内连接VS左连接

内连接:连接键如果匹配上,就连接,没有匹配上,就丢掉!

左连接:以左表为准(左表中的所有数据都会出现),右表匹配主表,匹配上就写入,没匹配上就写null。---因为null的存在,就有了业务上最终的漏斗模型!

以下表格完整解释了左连接与内连接的区别!

举个例子:

create table tmp.qiuzhiliao as
select t1.u_user,t1.date_sk
from (
select u_user,date_skfrom dw.orderwhere date_sk between 20190211 and 20190318and status in  ('支付成功')
)t1
left join (select u_userfrom dw.orderwhere date_sk between 20190211 and 20190318and status = '退款成功'
)t2
on t1.u_user=t2.u_user
where t2.u_user is null

业务中最常用的模型:主表t1是支付成功的用户(包括先支付成功,然后又退款的用户),t2表是退款成功的用户;通过左连接,并where限制,就可以求出实际付款成功的用户(支付成功-退款成功)

我们什么时候使用内连接了:因为表设计的原因,我们一张表不可能容纳所有的数据项,从io性能角度出发,表维度越大,查询时间越长;所以你想跨表引用字段时,就可以使用内连接!

举个例子:A表有用户,视频,支付类型;B表有视频,视频时长;

你现在想知道:用户看了多久的视频;你就得获取A表的用户,视频名,B表的视频时长。

你就得使用内连接。

表设计中:不是所有的表都有主键,但表之间要发生连接,就一定需要主键;那么没有外键约束的表,称为父表;有外键约束的表称为子表;并且子表的外键就连接在主表的主键上。

主键:非空,唯一约束;主键在一张表中,只有一个!但一个主键可以包括多个字段(联合主键)。

回到本题:A表中的视频就是主键,B表中的视频就是外键!

distinct的用法

1、distinct有去除重复值的效果,但查询字段>=2时,就是对这两个字段联合去重(两个字段同时相同,才会被当作重复值)

2、distinct只能放在首列,否则报错!

3、去除重复值最好用group by,distinct更多时候出现在count(distinct 字段)中用于统计去除重复值的条数。

MySql中distinct的用法 - 苔苔以苔苔以苔 - 博客园

order by 的注意事项

1、order by放在语句的最后,同时执行顺序也是最后。

2、order by放在子查询中会失效,一般放在主查询中最后执行!

又经过其它侧面证明,order by放在主查询中得到的u_user才是我们想要的前30名用户!

group by

1、group by+聚合键;

2、select 后只能出现聚合键,或是聚合函数;不能出现其它的字段,否则报错!

SQL中GROUP BY用法示例

having 有时真的很牛逼

1、having只能跟在group by后,不能单独使用;

2、having是对group by分组后的数据进行筛选判断。

SQL中GROUP BY用法示例

topN问题

1、分组取最大,最小,平均值;group by +聚合函数;但无法得到聚合键之外的数据,这时可以使用关联子查询。

2、求得每组前两名数据;limit+union all

select 课程号,max(成绩) as 最大成绩
from score
group by 课程号;

分组取最大,但得不到聚合键之外的数据;

select *
from score as a
where 成绩 = (
select max(成绩)
from score as b
where b.课程号 = a.课程号);

使用关联子查询实现;

每组最大的N条记录

1、先求出最大记录所在的组

2、union连接

select 课程号,max(成绩) as 最大成绩
from score
group by 课程号;(select * from score where 课程号 = '0001' order by 成绩  desc limit 2)
union all
(select * from score where 课程号 = '0002' order by 成绩  desc limit 2)
union all
(select * from score where 课程号 = '0003' order by 成绩  desc limit 2);

标准SQL与基于hive的SQL

在标准SQL中,我们有以下语句:查询所有课程成绩小于60分学生的学号、姓名

select 学号,姓名
from student
where  学号 in (
select 学号
from student
where 成绩 < 60
);

在Hive中,in后只能跟字符串;比如in ('huawei','oppo'),不允许出现上述的语法结构!

现在通过内连接,对上述语言进行改写:

select t1.学号,t1.姓名
from (
select 学号,姓名
from student
)t1
inner join (select 学号
from student
where 成绩 < 60
)t2
on t1.学号=t2.学号

不得不知的聚合函数

1,sum与case when的结合

2,count与case when的结合

使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称;

只为讲清逻辑,想了解表格结构,具体思路,请点击文末提供的参考文献。

select a.课程号,b.课程名称,
sum(case when 成绩 between 85 and 100 then 1 else 0 end) as '[100-85]',
sum(case when 成绩 >=70 and 成绩<85 then 1 else 0 end) as '[85-70]',
sum(case when 成绩>=60 and 成绩<70  then 1 else 0 end) as '[70-60]',
sum(case when 成绩<60 then 1 else 0 end) as '[<60]'
from score as a right join course as b
on a.课程号=b.课程号
group by a.课程号,b.课程名称;

接下来给一个企业级别的应用(已经去除敏感信息):基于Hive

--产品路径统计可以这么写
--春节活动入口统计SELECT day,count(CASE when x2_1.event_key = 'initApp'  then x2_1.u_user ELSE NULL end) as ad_pv,--开屏曝光的pvcount(DISTINCT CASE when x2_1.event_key = 'initApp'  then x2_1.u_user ELSE NULL end) as ad_uv,--开屏曝光的uv
FROM(SELECT from_unixtime(unix_timestamp(cast(day as string),'yyyyMMdd'),'yyyy-MM-dd') as day,event_key,u_user,status,button,devicefrom tableWHERE from_unixtime(unix_timestamp(cast(day as string),'yyyyMMdd'),'yyyy-MM-dd') BETWEEN '2019-03-28' and date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1) --intAND--开屏曝光event_key = 'initApp'
group by day
order by day

这种写法在企业中很常见;统计验证埋点数据是否正常,我们一般将case when 当作if else 使用。

SQL优化

1、Hive sql中多表join时,需要将小表写在左边,hive会将小表数据存放内存中,以实现MR中map join的效果;sparksql中,join时大小表的顺序对执行效率几乎没有影响。sparksql-cache小表实现mapjoin优化性能-云栖社区-阿里云

2、count (*)会返回包含null的行数;count (字段)返回不包括null的行数;

3、spark 支持非等值连接,并且查询速度高于hive;一般先在spark上创建表格,然后再hive中查询并导出查询结果。

……

需要注意的事项

0、SQL语言很笨,有时你以为你要的A,实际上跑数是B;SQL语言又很清晰,只要你的逻辑清楚,就可以得出你想要的数据!

1、内连接无所谓表先后顺序;漏斗模型,谁是最左边的表至关重要!选谁漏斗谁要符合业务!

2、筛选哪个表字段,就限制该表渠道,至于连接的其他表,字段不必限制(防止过紧,实际上限制与不限制可能效果一样)

3、左连接漏斗模型,记住右表有NULL,所以,不能group by 右表字段,计数左表字段!(内连接可以)

3、理清了业务逻辑,再去写SQL开发,在用户行为中想SQL逻辑,想清楚用漏斗还是内连接(二者有时可以替换),连接条件是连接用户,还是设备,连接渠道,还是时间(按日),一个表中哪个字段是定的,哪个字段是变的,是否存在一对多关系(一个假mac对应多个用户)

4、建表时,多用字段,少where限制(where用在查询时限制),这样可以保证少建表。

hive hsql 漏斗模型_数据分析之SQL:常用模型相关推荐

  1. hive使用适用场景_数据分析之hive学习(四):面试题——场景输出(row_number)...

    前言: 以sql为基础,利用题目进行hive的语句练习,逐步体会sql与hive的不同之处. 本次题目用到row_number().collect_set().concat_ws(). 其中colle ...

  2. 网页怎么预先加载模型_使用预先训练的模型进行转移学习

    网页怎么预先加载模型 深度学习 (Deep Learning) 什么是转学? (What is Transfer Learning?) Transfer learning is a research ...

  3. lr模型和dnn模型_建立ML或DNN模型的技巧

    lr模型和dnn模型 机器学习 (Machine Learning) Everyone can fit data into any model machine learning or deep lea ...

  4. rfm模型python_数据分析实战——用RFM模型分析客户价值

    数据分析实战--用RFM模型分析客户价值 阿雷边学边教python数据分析第4期--数据可视化 一.介绍什么是RFM模型和作用 1.什么是RFM模型 RFM模型是衡量客户价值的一种工具,该模型通过客户 ...

  5. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  6. 怎么做 空间杜宾模型_面板数据空间杜宾模型

    4.3.1 模型及估计 (1) 无固定效应模型 当SAR和SEM模型在一定的显著性水平下同时成立时,我们需要进一步考虑面板数据空间杜宾模型,即解释变量的空间滞后项影响被解释变量时,就应该考虑建立空间杜 ...

  7. python knn模型_使用Python训练KNN模型并进行分类

    K临近分类算法是数据挖掘中较为简单的一种分类方法,通过计算不同数据点间的距离对数据进行分类,并对新的数据进行分类预测.我们在之前的文章<K邻近(KNN)分类和预测算法的原理及实现>和< ...

  8. fluent p1模型_干货 | ANSYS Fluent燃烧模型简介

    燃烧是一种相当复杂的化学反应,通常还伴随着流体流动.离散相颗粒扩散.传热.污染物产生等多种物理情况.为尽可能详细仿真多种化学反应,ANSYS Fluent提供了多种化学反应模型如EDC,EDM,PDF ...

  9. seq2seq模型_对话生成:seq2seq模型原理及优化

    更多干货内容敬请关注「平安寿险PAI」(公众号ID:PAL-AI),文末有本期分享内容资料获取方式. 人机对话作为人机交互系统的核心功能之一,发挥着十分重要的作用.目前,生成式的人机对话存在内容把控性 ...

最新文章

  1. Semplice Linux 3.0.0 发布
  2. 当老板说要把公司当家时,他在说...
  3. Java IO 体系(二): inputstream与outputstream
  4. 工作问题之:redis 保存快照问题
  5. 将m文件通过matlab 的编译器转换为可执行文件,【转】 Matlab中提高m文件执行效率的小技巧...
  6. 三,linux系统的由来
  7. build shop
  8. Common lisp之加载方式(一)
  9. 使用docker运行Mysql客户端
  10. 【Adobe Premiere Pro 2020】pr2020转场与过度的使用说明【批量修改图片时长、转场特效制作等】、时间轴及工具栏的使用说明、静态帧制作动态效果、制作影片曲线变速、PR消除画面抖动
  11. C/C++函数库 之 ctype.h
  12. 从零开始设计一个共识算法——一场没有硝烟的战争
  13. 自学考试计算机实践课,河南大学自学考试计算机实践课考试须知
  14. “听我说谢谢你”还能用古诗来说?清华搞了个“据意查句”神器,一键搜索你想要的名言警句...
  15. 服务器返回MOD文件失败,[17-02-06]【复杂问题】求助,forge服务器加了MOD后无法运行...
  16. MapReduce明星搜索指数统计,找出人气王
  17. 2020Android大厂高频面试题(字节跳动+阿里+华为+小米等20家大厂面试真题)附面经!
  18. 电力负荷预测三篇综述总结
  19. Ubuntu使用sudo apt-get upgrade升级软件出现问题后的处理
  20. cannot be resolved to a type 错误解决

热门文章

  1. 5G + 云网融合,加速万物互联
  2. 张小龙的区区一件衣服竟然能引起这么大骚动
  3. 真正勇猛的程序员,敢于让鲁迅崩溃!
  4. 爆炸了!刚刚!小姐姐说她找了个程序员男友
  5. 杨镭访谈:UCloud 的技术价值观
  6. 何时弃用 MongoDB?| 技术头条
  7. 无代码编程时代下,程序员要失业了?
  8. Python 爬取张国荣最火的 8 首歌,60000 评论看完泪奔!
  9. 特斯拉起诉小鹏汽车员工窃取 30 多万份商业机密,何小鹏回应
  10. 特斯拉退市,是一个工程师的执拗