mysql开窗函数排序_SQL Server进阶(八)查询——开窗函数、四大排名函数、透视数据、逆透视数据...

本文详细介绍了SQL Server中的开窗函数,包括ROW_NUMBER、RANK、DENSE_RANK和NTILE,并通过实例展示了它们在数据排序和分组中的应用。此外,还讲解了数据透视和逆透视的概念及实现方式,帮助读者理解如何在SQL中进行行转列和列转行的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

ROW_NUMBER() OVER(PARTITION BY CustId ORDER BY ID DESC)

https://www.jb51.net/article/75533.htm

开窗函数

SELECTempid, ordermonth, val,SUM(val) OVER(PARTITION BYempidORDER BYordermonth

ROWSBETWEENUNBOUNDED PRECEDINGAND CURRENT ROW) ASrunvalFROM Sales.EmpOrders;

四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)

ROW_NUMBER()的用途的非常广泛,排序最好用他,一般可以用来实现web程序的分页,他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

rownum列就是row_number函数生成的序号列,其基本原理是先使用over子句中的排序语句对记录进行排序,然后按照这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同。

dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

SELECTorderid, custid, val,

ROW_NUMBER()OVER(ORDER BY val) ASrownum,

RANK()OVER(ORDER BY val) ASrank,

DENSE_RANK()OVER(ORDER BY val) ASdense_rank,

NTILE(10) OVER(ORDER BY val) ASntileFROMSales.OrderValuesORDER BY val;

943b673f51a83bbca4a8d49f61f6ce23.png

偏移开窗函数

透视数据 (pivoting)——行旋转列

是一种把数据从行的状态 旋转 为列的状态的处理,在这个过程中可能需要对值进行聚合(有需求的话)。

1067d4652ecdfb28caa95364d8435566477.jpg

f286f880a32b27a1577595b90ed62504bed.jpg

create table tb(姓名 varchar(10),课程 varchar(10),分数 int)insert into tb values('张三','语文',74)insert into tb values('张三','数学',83)insert into tb values('张三','物理',93)insert into tb values('李四','语文',74)insert into tb values('李四','数学',84)insert into tb values('李四','物理',94)

建立表格

0776b8e2e2bef270ac0f2c746eac9c0b.png

9fcbfa3b06a9effce695374a84b8d3e4f09.jpg

eea83fe72bff3b82a3bfa75e372e166923a.jpg

select * fromtbselect姓名,max(case 课程 when'语文'then 分数 else 0 end)语文,max(case 课程 when'数学'then 分数 else 0 end)数学,max(case 课程 when'物理'then 分数 else 0 end)物理,sum(分数)总分,cast(avg(分数*1.0)as decimal(18,2))平均分fromdbo.tbgroup by姓名--select * from tb pivot(max(分数) for 课程 in(语文,数学,物理)) a

select m.*,n.总分,n.平均分 from(select * from tb pivot(max(分数) for 课程 in(语文,数学,物理))a)m,

(select 姓名,sum(分数)总分,cast(avg(分数*1.0)as decimal(18,2))平均分 from tb group by姓名)nwhere m.姓名=n.姓名

View Code

790f49be59f46f7c30b4a8aa7b637eed.png

https://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html

https://blog.youkuaiyun.com/qq_37750627/article/details/70670308

逆透视数据 (unpivoting) ——列转行

逆透视转换则是把数据从列的状态旋转为行的状态

分组集

小结

练习

解决方案

https://www.cnblogs.com/edisonchou/p/6106755.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值