【数据分析第七天】复杂sql语句查询

本文介绍了窗口函数在SQL中的应用,重点讲解了静态和滑动窗口函数,特别是排序窗口函数(如rank(),dense_rank(),row_number()),以及如何使用它们进行分区倒序排序和找出最高分。通过一个实例演示了如何利用窗口函数找出票数最高的候选人。
摘要由CSDN通过智能技术生成

窗口函数总介绍

窗口函数的位置一般可以放以下2种函数

(一)静态窗口函数:

排名函数 rank()、dense_rank()、row_number();

(二)滑动窗口函数:

聚合函数 sum、 avg、percent_rank();

取值函数 first_value()、last_value()、nth_value()、lag()、lead()、ntile();

本文主要研究排名函数

因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中

排序窗口函数

排序窗口函数主要有以下3种:

这3种函数的主要区别是在对于重复数值的处理上的的区别,就好比给学生成绩排序,假如有3个并列第一,那么对于前4名,rank()的排序是1、1、1、4;dense_rank()的排序是1、1、1、2,row_num()的排序是1、2、3、4.

窗口函数后面的over()子句内容中,partition by、order by和我们学过的group by, order by功能高度重合,但是group by分组汇总后会改变表的行数,一行只有一类,而partition by不会改变行数,只会在原有的基础上增加一列作为排序后的结果。

group by 同条件结果

另外,partition是可以省略的,即不分组直接排序,如图,order by 是不可以省略的

相信通过以上内容,大家对于排序窗口函数也已经有了一定了解,我认为在sql中排序窗口函数的关键字在于排名,最高,最低

下面让我们来看一道例题

我们的目标是选出票数最高的候选人,很显然,我们首先要1.倒序排序,然后再得出2.票数最高的候选人,需要用到子查询。我们思路如下,要排序,选择rank()窗口函数,首先根据partition by contituency,进行分区,然后通过order by votes排序,

select constituency,party,rank()over(partition by constituency order by votes desc) posn 
from ge
where constituency  BETWEEN 'S14000021' AND 'S14000026'
AND yr  = 2017

通过以上我们就完成了分区倒序排序,部分结果如下

那么我们如何取出第一名呢?可以在把以上代码作为查询范围,选出posn = 1的即为所求,代码如下

select constituency,party 
from
(select constituency,party,rank() over(partition by constituency order by votes desc) posn 
  from ge
  where constituency  BETWEEN 'S14000021' AND 'S14000026'
 AND yr  = 2017) rk
where rk.posn=1

那么这道例题就完成啦!

图片解释来自https://yrzu9y4st8.feishu.cn/mindnotes/bmncnhnbFWnUNvUq6qTkq49IQ3c#outline

你今天很棒!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值