取消oracle分组方式,Oracle分组排序几种常见方式

本文详细介绍了SQL中的分组排序技巧,包括row_number()、rank()和dense_rank()三个函数的使用。通过实例展示了它们在分组内部排序中的不同行为:row_number()生成连续唯一的组内序号,rank()在出现相同排序值时产生跳跃排序,而dense_rank()则保持连续性。同时,文章还提及了如何在分组排序后选取每个组内的前几条记录,以及涉及的相关SQL查询语法。
摘要由CSDN通过智能技术生成

在日常操作中分页和分组比较多见,这里主要讲讲分组排序的不同场景:

1.row_number() over()

row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。

Sql代码

select t.*,row_number() over(partition by accno order by createDate) row_number from Test t

查询结果如下:

53c9aecb70b9ceb20f00db53b0d10763.png

大家可以注意到ACCNO为111的记录有两个相同的CREATEDATE,用row_number函数,他们的组内计数是连续唯一的,

2.rank() over()

rank()是跳跃排序,有两个第二名时接下来就是第四名。

rank的sql:

select t.*,rank() over(partition by accno order by createDate) rank from Test t

查询结果:

3fd6c1682d8e694e82aee02677c2902a.png

可以发现相同CREATEDATE的两条记录是两个第2时接下来就是第4.

3.dense_rank() over()

dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。

Sql代码

select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t

查询结果:

52a42a432d6fafb9d7d1fc42725fe23b.png

可以发现相同CREATEDATE的两个字段是两个第2时接下来就是第3.

再比如有时会要求分组排序后分别取出各组内前多少的数据记录(需要用到子查询,先将数据进行分组排序,然后再分组排序后的数据中筛选符合条件的数据),sql如下:

Sql代码

select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4

查询结果如下:

b3cb4a64a2184f44e69b808d81b84226.png

-----mysql 分组

SELECT a.group, SUBSTR(GROUP_CONCAT(sort ORDER BY sort DESC) FROM 1 FOR 1) maxsort

FROM t_sort_g a

GROUP BY `group`;

SELECT *

FROM t_sort_g a

LEFT JOIN t_sort_g b ON b.`group` = a.`group` AND a.sort < b.sort

WHERE b.sort is null ORDER BY a.`group`;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值