sql 分组求和_数据仓库工具–Hive(归纳笔记第六部分:SQL练习)

1b861f3baae31dca7bd2ef5cba68aaf2.png

写在开头:

本章是Hive教程第六部分,着重于归纳SQL编写。

文章内容输出来源:拉勾教育大数据高薪训练营。

本章将介绍Hive中常见的面试题和自己的解答思路,以供大家训练和记忆。

SQL面试题

1、求连续7天登录的用户

— 数据。uid dt status(1 正常登录,0 异常)

1 2019-07-11 1
1 2019-07-12 1
1 2019-07-13 1
1 2019-07-14 1
1 2019-07-15 1
1 2019-07-16 1
1 2019-07-17 1
1 2019-07-18 1
2 2019-07-11 1
2 2019-07-12 1
2 2019-07-13 0
2 2019-07-14 1
2 2019-07-15 1
2 2019-07-16 0
2 2019-07-17 1
2 2019-07-18 0
3 2019-07-11 1
3 2019-07-12 1
3 2019-07-13 1
3 2019-07-14 0
3 2019-07-15 1
3 2019-07-16 1
3 2019-07-17 1
3 2019-07-18 1

思路:典型的连续值求解问题,可以按照以下思路进行求解

  1. 使用 row_number 在组内给数据编号(rownum)
  2. 某个列值 – rownum = gid,得到结果可以作为后面分组计算的依据(这个某个列值,该题目问日期是否连续,所以拿日期这列)
  3. 根据求得的gid,作为分组条件,求最终结果

因为求的是连续七天登录的用户,所以这个列值选dt,

所以先写sql:(date_sub为dt与rownum的差值)

select uid,dt,status,
date_sub(dt,row_number() over(partition by uid order by dt)) gid
from ulogin
where status =1

首先来看下结果:

b199ae0af09c1b1de9510659e542f7ed.png

从上述步骤中我们需要按照gid和uid进行分组,然后计算出相同gid的个数,然后再选出大于7的数据即可。所以在原先基础上在套一层select查询,做条件筛选,所以完整SQL这样写:

select uid,count(*) countlogin from
(select uid,dt,status,
date_sub(dt,row_number() over(partition by uid order by dt))gid
from ulogin
where status =1) tmp
group by uid,gid
having countlogin >=7;

82a9fc1348fd747cbd5c9b45609c8e0c.png

可以看出连续登陆七天以上的用户只有uid,而且uid连续登陆了8天。

2.编写sql语句实现每班前三名,分数一样并列,同时求出前三名按名次排序的分差(TopN问题)

— 数据。sid class score

1 1901 90
2 1901 90
3 1901 83
4 1901 60
5 1902 66
6 1902 23
7 1902 99
8 1902 67
9 1902 87

— 待求结果数据如下:

class score   rank      lagscore
1901    90      1           0
1901    90      1           0
1901    83      2           -7
1901    60      3           -23
1902    99      1            0
1902    87      2          -12
1902    67      3          -20

从结果要求上可以看出,首先要用到排序函数排除顺序,然后使用序列函数将数据整体下移一行,然后才可以相减算差值。而且可以看到需要按class分组。

首先我们写出有排名函数的sql:

select class,score,
dense_rank() over(partition by class order by score desc) rank
from stu

然后将score下移一行,将下移后的数据额外增加一列lagscore,并指定按照class分区,按照score降序排序。

select class,score,
dense_rank() over(partition by class order by score desc) rank,
lag(score) over(partition by class order by score desc)  lagscore
from stu

0bfb1d0f52b10952a28fccd22570a7f0.png

从上图中我们可以看到数据下移后会有null值,我们可以使用nvl函数进行处理,接下来我们处理差值问题,我们可以直接用score列减去lag(score) over(partition by class order by score desc)这行sql。如下所示:

select class,score,
dense_rank() over(partition by class order by score desc) rank,
nvl(score-lag(score) over(partition by class order by score desc),0) lagscore
from stu

30ac0653c62f2827b6717d3ba7751f70.png

接下来按照题目要求,要前三名的数据。那么我们可以再嵌套一层select语句,加上where条件完成:

select class,score,rank,lagscore from
(select class,score,
dense_rank() over(partition by class order by score desc) rank,
nvl(score-lag(score) over(partition by class order by score desc),0) lagscore
from stu) tmp
where rank<=3;

cc63c527b2a78033b0f30d53b8d49146.png

从上可以看出结果。

3.综合八道题:

现在有三张表:

4b859ad69ad4010867fe99f1ed704a68.png

6f6bb2c38279609242dd3eebcca347d0.png

第一张表的部分数据

9750ad23f7da380f84af667357973cb0.png

第二张表的部分数据

8101ee364803e6898c0e2280381fa75c.png

第三张表部分数据

47a40cf6d58a21b076fa41e9d665ed5b.png

1、按年统计销售额

思路:使用join连接saledetail和sale表,连接条件为orderid,又因为按年统计,所以要按照年分组。这里使用year函数获取年份,sum函数进行求和,求和完成后除掉10000,意思单位以万元计,再使用round函数保留小数点2位。

SELECT year(B.dt) year, round(sum(A.amount)/10000, 2) amount 
FROM saledetail A join sale B on A.orderid=B.orderid 
group by year(B.dt);

9fae58302dcd23dc1047f6e2996d8f56.png

2、销售金额在 10W 以上的订单

思路:按照orderid做分组,然后求和,求出和后选出金额大于十万的数据。

SELECT orderid, round(sum(amount), 2) amount 
FROM saledetail 
group by orderid 
having sum(amount) > 100000

54bd78ac2f67847dbd15160edcbaedd5.png

3、每年销售额的差值

思路:先求出每一年的销售额,按照年分组,然后求和,思路与第一题一致,因为要求差值,所以要用到某一列去减序列函数,所以将第一步得到的结果作为表t1,然后以t1表作为基表去求差值,用total-lag函数完成运行。

with t1 as
(select year(s.dt) year,round(sum(amount)/10000,2) total
from saledetail st join sale s on st.orderid=s.orderid
group by year(s.dt)
)
select year,
round(total - lag(total) over(order by year),2) diff
from t1;

3d1a08b248bf55dea8d8f3c52727c959.png

4、年度订单金额前10位(年度、订单号、订单金额、排名)

思路:连续值求解问题,我们可以先求出年度订单的总金额,也就是用年和订单id来分组,用sum求和。然后作为基表去查询排名函数dense_rank,求得排好序的数据表。最后再作为基表添加where过滤条件得到结果。

with t1 as(
select year(dt) dt,s.orderid orderid,sum(amount) total
from saledetail sd join sale s on sd.orderid=s.orderid
group by year(dt),s.orderid ),
t2 as(
select dt,orderid,total,
dense_rank() over(partition by dt order by total desc) rank
from t1
)
select dt,orderid,total,rank
from t2
where rank<=10

部分结果:

bb80ac9b3069a519bd6ad56fcf76a85d.png

5、季度订单金额前10位(年度、季度、订单id、订单金额、排名)

思路:比上一题增加了季度,季度在日期表中有,所以这里要三表连接,然后再使用排名函数dense_rank()按照年和季度分区,按照金额降序排序,最后在嵌套一层select语句即可完成。

with tmp as ( 
select C.year, C.quat, A.orderid, round(sum(B.amount), 2) amount 
from sale A join saledetail B on A.orderid=B.orderid 
join dimdate C on A.dt=C.dt 
group by C.year, C.quat, A.orderid 
)
select year, quat, orderid, amount, rank 
from (
select year, quat, orderid, amount, 
dense_rank() over (partition by year, quat order by 
amount desc) rank 
from tmp 
) tmp1 
where rank <= 10;

这里展示部分结果:

ab6c88d947252cfd6b52a9ef6d43b4f0.png

6.求所有交易日中订单金额最高的前10位

思路:TopN问题,首先根据日期和订单id分组,使用sum函数求出总金额,然后使用dense_rank()排名函数根据总金额降序排序,最后使用where条件选出相应的数据。

with tmp as ( 
select A.dt, A.orderid, round(sum(B.amount), 2) amount 
from sale A join saledetail B on A.orderid=B.orderid 
group by A.dt, A.orderid 
)
select dt, orderid, amount, rank 
from (
select dt, orderid, amount, dense_rank() over(order by 
amount desc) rank 
from tmp 
) tmp1 
where rank <= 10;

6372b8572d421849f701b981e60afba6.png

7、每年度销售额最大的交易日

思路:首先按年分组,使用sum函数求和,然后再使用max函数挑出每年最大的交易时间。

with tmp as ( 
select A.dt, round(sum(B.amount), 2) amount 
from sale A join saledetail B on A.orderid=B.orderid 
group by A.dt 
)
select year(dt) year, max(amount) dayamount 
from tmp 
group by year(dt); 

0ee7be3856a7e30bec6c3dc85c5defe1.png

8、年度最畅销的商品(即每年销售金额最大的商品)

思路:现根据年和商品分组,使用sum求出总金额,然后使用排名函数dense_rank()排名,按照年分区,按照总金额降序排序。因为题目要最畅销商品,所以where条件要rank=1。

with tmp as ( 
select year(B.dt) year, goods, round(sum(amount),2) amount 
from saledetail A join sale B on A.orderid=B.orderid 
group by year(B.dt), goods 
)
select year, goods, amount 
from (select year, goods, amount, dense_rank() over (partition 
by year order by amount desc) rank 
from tmp) tmp1 
where rank = 1;

7e313bdd3d4e0052a0744509ffc309d1.png

写在结尾:

这里归纳了常见的sql面试题,需要大家记忆连续值求解和TopN问题,当然也需要不断理解相应的业务来变化sql代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tableau上面地图与条形图结合_何为计算的详细级别,认识Tableau中的Level of Detail...

何为详细级别详细级别&#xff0c;英文Level of detail&#xff0c;Tableau用它来描述计算发生的级别&#xff0c;或者说计算在哪个层级发生。由于BI工具的相似性&#xff0c;在Power BI里也可以用类似的思想对计算进行描述&#xff0c;但Power BI并没有与之对应的专门的词汇。…

java 异步读表,Java实现异步回调-Go语言中文社区

回调(callback)在我们做工程过程中经常会使用到&#xff0c;今天想整理一下回调的原理和使用方法。回调的原理可以简单理解为&#xff1a;A发送消息给B&#xff0c;B处理完后告诉A处理结果。再简单点就是A调用B&#xff0c;B调用A。那么是如何实现的呢&#xff1f;一般而言&…

mysql 按时间累计计算_精通MySQL索引背后的数据结构及算法原理

本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;mysql支持诸多存储引擎&#xff0c;而各种存储引擎对索引的支持也各不相同&#xff0c;因此MySQL数据库支持多种索引类型&#xff0c;如BTree索引&#xff0c;哈希索引&a…

matlab数据游标属性设置,将节点属性添加到图论图数据提示

绘制具有数据提示的 GraphPlot 对象创建随机有向图的 GraphPlot 图对象。将额外的节点属性 wifi 添加到该图。rng defaultG digraph(sprandn(20, 20, 0.05));G.Nodes.wifi randi([0 1], 20, 1) 1;h plot(G);向图中添加数据提示。利用数据提示&#xff0c;您能够选择图论图中…

matlab 邻近度 离群点_MATLAB自制迷宫游戏,快来试试吧!

前几天给大家介绍了“一行matlab代码可以做哪些匪夷所思的事情”&#xff0c;今天小编带给大家一款酷炫的私人订制版迷宫游戏。这款迷宫游戏包含以下功能&#xff1a;随机生成迷宫地图通过键盘手动求解生成的迷宫MATLAB自动求解生成的迷宫目前主流的生成迷宫的算法有&#xff1…

matlab中m文件的作用,M文件主要包含()_matlab中m文件的好处

M文件主要包含()答&#xff1a;M函数文件\n\nM命令文件(脚本文件)" src"" style"max-width: 100%; display: inline;">中国大学MOOC: 在缓冲区分析中二次模型的表示的主体对象对临近对象的影响随距离的增大呈线性衰减。答&#xff1a;错巡航速度是…

xcopy复制文件夹及其子文件_嗨学习:如何给电脑中文件夹设置密码

文件夹怎么设置密码,如何给文件夹设置密码?有些重要的文件或比较隐私的文件存放在电脑上&#xff0c;这些文件我们只希望自己能看到并使用&#xff0c;不希望别人访问。那么&#xff0c;最好的办法就是去对这些文件进行加密。 才不怕别人看到自己的隐私&#xff0c;设置密码&a…

php的修改数据库语句怎么写,php的数据库修改语句是什么

php的数据库修改语句是UPDATE&#xff0c;用于更新数据库表中已存在的记录&#xff0c;语法为【UPDATE table_name SET column1value, column2value2,...WHERE some_columnsome 】。本教程操作环境&#xff1a;windows7系统、PHP5.6版&#xff0c;DELL G3电脑。UPDATE 语句用于…

ubuntu20.04中安装划词翻译_教你轻松玩转免安装的网页翻译插件“有道网页翻译2.0”...

大家在日常网页浏览中肯定多多少少都会碰到英文网站&#xff0c;这时候往往需要花费非常多的时候去自行理解&#xff0c;效率低下&#xff0c;又或者借助浏览器自带的翻译功能进行翻译&#xff0c;但又可能遇到翻译不准的情况。现在这个问题可以解决啦&#xff01;“有道网页翻…

python 主要内容,介绍一些有关python的重要内容

Python的参数传递方式是&#xff1a;位置&#xff0c;默认值&#xff0c;变量参数&#xff0c;关键词参数。传值究竟是函数的值传递还是引用传递&#xff0c;要分情况&#xff1a;不变参数用值传递&#xff1a;像整型和string这样的不变对象是通过拷贝来传递的&#xff0c;因为…

系统业务逻辑书籍_「樊登读书会强推:免费送10本绝密书」彻底改变你的逻辑思维能力...

哈喽~你好我是JS-冰冰今天在星巴克喝咖啡整理了一些巨大价值的绝密资料&#xff0c;从过往在樊登读书会整理的10本彻底改变《逻辑思维能力》的绝密电子书。非常实用&#xff0c;对我的改变和提升非常有帮助&#xff0c;所以想把这份改变命运的绝密大礼包也送给需要的小伙伴~(怎…

饿了么风神登录_海底捞首度登陆第三方外卖!联手饿了么全国配送“小火锅”...

近日&#xff0c;“海底捞”正式联手饿了么推出第三方外卖配送服务。据悉&#xff0c;这是海底捞首次与本地生活服务平台合作推出第三方外卖业务。包括上海、济南、福州、郑州等多个城市的用户登录饿了么平台&#xff0c;下单购买海底捞“小火锅”外送等产品后&#xff0c;便可…

数据相关的在职研究生_南方医科大学2020年招收在职博士研究生导师名单及复试考生名单!...

南方医科大学2020年在职博士研究生入围复试考生名单各位考生&#xff1a;根据我校招收2020年在职博士研究生相关工作规定&#xff0c;现就进入复试考生名单予以公示&#xff0c;请入围复试考生密切关注我校相关复试公告&#xff0c;做好复试准备。南方医科大学招收2020年在职博…

富文本++php+源码,自己实现富文本编辑器

【实例简介】网页中经常需要输入多种资料&#xff0c;自带的TextBox不够用【实例截图】【核心代码】//************************************************************************************//将texttemp内容移入iframeiframeDocument.body.innerHTML parent.document.getE…

gridlayoutmanager 设置间距_不设置主灯的客厅应当如何保证较好的灯光分布?

如果没有从事照明设计的专业人士或者是比较有经验的室内设计师协助业主做决策&#xff0c;个人不太建议普通业主自行设置“无主灯客厅”的灯光分布。在日常设计工作中&#xff0c;如果委托人确已考虑放弃主灯&#xff0c;通常我也会建议业主保留已有的客厅主灯的灯控线路及开关…

Oracle filter 函数,Oracle数据库之SQL单行函数---字符函数续

前一篇博客练习了一些字符函数,之后自己又去下查阅了相关的资料&#xff0c;上一篇博客中还有很多的字符函数没有练习到&#xff0c;这次主要是对上次的一些未用到的字符函数进行一些补充练习。ascii()返回与指定的字符对应的十进制数&#xff0c;若为字符串则返回字符串首字母…

怎么画单极交流放大电路波形图_珠海放大IC怎么样

容抗XC1/2πf c (f表示交流信号的频率&#xff0c;C表示电容容量)电话机中常用电容的种类有电解电容、瓷片电容、贴片电容、独石电容、钽电容和涤纶电容等。集成电路更着重电路的设计和布局布线&#xff0c;芯片更强调电路的集成、生产和封装。而广义的集成电路&#xff0c;当涉…

图片识别不了小程序怎么办_图片转文字【微信小程序】

文字识别小程序在文章的底部直接拉到文章底部就可使用↓↓↓↓↓↓工作中&#xff0c;很多时间需要把纸质文稿上的大段文字变成可编辑文字&#xff0c;有时我们会一个一个文字录入&#xff0c;有时我们可以采用扫描仪&#xff0c;我们也用过扫描全能王APP。这里给大家介绍一种方…

切片器可以设置日期格式?_Power BI 中的切片器

何时使用切片器在要完成以下操作时&#xff0c;切片器非常有用&#xff1a;在报表画布上显示常用或重要的筛选器&#xff0c;用以简化访问。更轻松地查看当前筛选的状态&#xff0c;而无需打开下拉列表。按数据表中不需要的和隐藏的列进行筛选。通过将切片器放置在重要的视觉对…

linux打印jvm内存堆栈_5款强大的JVM 性能调优监控工具

原文链接&#xff1a;www.iteye.com/blog/josh-persistence-2161848现实企业级Java应用开发、维护中&#xff0c;有时候我们会碰到下面这些问题&#xff1a;OutOfMemoryError&#xff0c;内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高......这些问题在日…