SQL分组获取记录的第⼀条数据——PARTITIONBY
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
数据表结构:
查询结果:
扩展:
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 ([ <partition_by_clause> ] <order_by_clause>) 。
备注:ORDER BY ⼦句可确定在特定分区中为⾏分配唯⼀ ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM ⼦句⽣成的结果集划⼊应⽤了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的⾏的顺序。
groupby是什么函数返回类型:bigint 。
语法格式:row_number() over(partition by 分组列 order by 排序列 desc)
row_number() over()分组排序功能:
在使⽤ row_number() over()函数时候,over()⾥头的分组以及排序的执⾏晚于 where 、group by、 order by 的执⾏。
原理:先按psd进⾏排序,排序完后,给每条数据进⾏编号。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论