SQL分组获取记录的第一条数据——PARTITION BY

 oracle分组查询:

获取分组后,每一组的第一条数据记录,sql如下

SELECT *
  FROM (SELECT A.*,
               ROW_NUMBER() OVER(PARTITION BY A.ORDERNO ORDER BY A.SPARE2 ASC) AS NEWINDEX
          FROM BYL_TEST A
        
        )
 WHERE NEWINDEX = 1

数据表结构: 

SQL分组获取记录的第一条数据——PARTITION BY_第1张图片

查询结果:

SQL分组获取记录的第一条数据——PARTITION BY_第2张图片 

 扩展:

partition by和group by对比

1. group by是分组函数,partition by是分析函数(然后像sum()等是聚合函数);

2. 在执行顺序上,

以下是常用sql关键字的优先级

from > where > group by > having > order by

而partition by应用在以上关键字之后,实际上就是在执行完select之后,在所得结果集之上进行partition(分组)。

3. partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类似excel中的操作),而group by则只保留参与分组的字段和聚合函数的结果(类似excel中的pivot)。

4. 如果在partition结果上聚合,千万注意聚合函数是逐条累计运行结果的!而在group by后的结果集上使用聚合函数,会作用在分组下的所有记录上。

其实partition by常同row_number() over一起使用,

什么是row_number()?

ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号。

ROW_NUMBER()

说明:返回结果集分区内行的序列号,每个分区的第一行从1开始。
语法:ROW_NUMBER () OVER  ([ ] ) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数 :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
      :确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。

 

语法格式:row_number() over(partition by 分组列 order by 排序列 desc)

row_number() over()分组排序功能:

在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、  order by 的执行。

原理:先按psd进行排序,排序完后,给每条数据进行编号。

你可能感兴趣的:(数据库sql)