每日一得--SQLServer 窗口函数(OVER、PARTITION BY)

一、窗口函数的作用


窗口函数是对一组值进行操作,不需要使用GROUP BY 子句对数据进行分组,还能够在同一行中同时返回基础行的列和聚合列。窗口函数,基础列和聚合列的查询都非常简单。

二、语法格式


  窗口函数的语法格式如下:

1
OVER([PARTITION  BY  value_expression,..[n] ] < ORDER  BY  BY_Clause>)
  • PARTITION:分组;

  • ORDER BY:排序;

首先建一张调试表如下:

1
2
3
4
5
6
CREATE  TABLE  [dbo].[xxx](
[Id] [ int NULL ,
[ Name ] [nvarchar](50)  NULL ,
[Operate] [nvarchar](50)  NULL ,
[Score] [ int NULL ,
[CreateTime] [datetime]  NULL ON  [ PRIMARY ]

往里面添加如下数据。

三、应用场景


1、聚合列与数据列共同显示

1
2
--查询姓名、分数、以及全体平均分
SELECT  Name , Score,  CAST ( AVG (Score) OVER()  AS  decimal (5,2) )  AS  '平均分'  FROM  xxx  

2、分组日期最新

1
2
3
4
--对每个人查询日期最新列
SELECT  FROM  (
     SELECT  row_number() OVER(PARTITION  BY  Name  ORDER  BY  CreateTime)  AS  part ,Score,  Name , CreateTime  FROM  xxx
AS  CWHERE C.part = 1

3、分页

返回结果集内的行号,每个分区从1开始,ORDER BY可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

四、排名函数


1、ROW_NUMBER()

返回结果集内的行号,每个分区从1开始计算,ORDER BY可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

1
SELECT  row_number() OVER(PARTITION  BY  Name  ORDER  BY  CreateTime) ,Score,  Name , CreateTime  FROM  xxx

输出如下:

2、RANK()

返回结果集的分区内每行的排序。行的排名是从1开始算。如果两个或多个行与一个排名关联,则每个关联行将得到相同的排名。

1
SELECT  RANK() OVER(PARTITION  BY  Name  ORDER  BY  SCORE) ,Score,  Name , CreateTime  FROM  xxx

  下面一张图片很好地说明了Rank与ROW_NUMBER的区别。

  

  3、DENSE_RANK()

  返回结果集分区中行的排名,与Rank()类似,只是对并列的处理稍有不同,详见示例。

SELECT DENSE_RANK() OVER(PARTITION BY Name ORDER BY SCORE) ,Score, Name, CreateTimeFROM xxx

  下面的示例展示了Rank()与Dense_Rank()的区别。

  

  4、NTILE()

   NTILE函数把结果中的行关联到组,并为每一行分配一个所属的组的编号,编号从1开始。对于每一个行,NTILE 将返回此行所属的组的编号。

  如果分区的行数不能被 integer_expression(就是传入的那个参数,表示分几个组的意思) 整除,则将导致一个成员有两种大小不同的组。按照 OVER 子句指定的顺序,较大的组排在较小的组前面。

--每个分区分2个组,该列是改行所属的组名SELECT NTILE(2) OVER(PARTITION BY Name ORDER BY SCORE) ,Score, Name, CreateTimeFROM xxx

  示例如下:

  

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL中的窗口函数over partition by是一种用于对数据进行分组计算的函数。它可以将数据按照指定的列进行分组,并在每个分组内进行计算。这种函数在数据分析和处理中非常常见,可以帮助我们更方便地进行数据聚合和统计。 ### 回答2: Spark SQL窗口函数是一种强大的函数,可以对窗口内的数据进行分组聚合、排序、排名、分析计算等操作。在实际的数据处理过程中,常常会遇到需要对数据进行分组、聚合等操作的场景,这时候,窗口函数就可以发挥重要作用。 Over partition by是spark sql中窗口函数中的一种非常强大的函数,能够对指定字段进行分组聚合。在使用over partition by时,需要定义一个窗口,即用来指定数据的分组方式。通常情况下,partition by子句用来指定需要分组的字段,over子句则用来执行数据计算的操作。 例如,如果需要计算一组数据不同时间点的总和,则可以使用over partition by函数来实现。首先,在select子句中指定需要计算的字段,然后使用over partition子句指定分组方式,最后使用sum函数计算总和。如下所示: ``` SELECT time,value,sum(value) over (partition by time) FROM table_name; ``` 上述示例中,partition by子句使用time字段进行分组,然后将value字段用于计算每个分组的总和。 除了上述示例中的聚合操作,Spark SQL中的over partition by函数还可以执行窗口排序、排名、累计计算、百分比计算等多种计算操作。例如,使用over partition by函数来实现窗口排序,则可以使用排列相关的函数,如rank、dense_rank、row_number等。 总结来说,Spark SQL中的over partition by函数是一种非常强大的窗口函数,可以在数据处理过程中实现复杂的分组、排序、排名、累计计算、百分比计算等多种计算操作。对于需要对数据进行多重分组、聚合分析的场景,使用over partition by函数可以非常方便地实现数据分析处理的任务。 ### 回答3: Spark SQL中的窗口函数over partition by是一种用于在查询结果集中处理数据的功能。窗口函数可以在数据中划分子集,执行聚合函数,计算行号等操作。这些操作与简单的分组聚合或排序不同,因为他们不会对查询结果进行分组,而是对子集进行操作,同时保留查询结果集的完整性。 over partition by语法可用于将查询结果集划分为多个分区,然后在每个分区上执行操作。对于每个分区,分配一个排名或数字,允许在对查询结果集进行其他处理之前,对子集进行排序或聚合操作。 over partition by语法的基本语法格式为: SELECT col1, col2, sum(col3) OVER (PARTITION BY col1) FROM table1 以上语句将查询结果集按照col1进行分区,并对每个分区进行col3的聚合操作,最后在每行返回结果集中的col1、col2、col3聚合总和。 over partition by语法中还可以使用其他聚合函数,如avg()、min()、max()等等。同时,还支持rank()、dense_rank()、row_number()、ntile()等其他更高级的分析函数。 over partition by的使用可以帮助我们更好的处理查询结果集中的数据。通过使用这个功能,我们可以轻松地执行各种分析操作,比如打造数据仪表盘、制定分析计划等等。当我们需要比单个分组细化分析数据时,over partition by语法就是非常有用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值