如何实现Oracle先组内排序然后再组外排序

本文解析如何使用SQL根据部门分组并实现等级和入职时间的双重排序,包括正序和倒序操作,通过示例和T1/T2表的构建详细指导。

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

问题描述

工作中遇到一个问题,因为我本人的SQL技术太差了,写了好久,都没有处理好,大概的需求如下,有一个列表,根据一个字段排序,排序后的结果,再根据字段排序。

问题分析

为了让读者能够充分理解这个问题,先分解问题
原始数据如下:

序号名称部门入职时间等级
1小明开发部2012-101
2小丽账务部2013-011
3小华开发部2021-013
4小红开发部2001-012
5小张账务部2022-012

1、先根据部门分组,然后根据等级排序(正序)
预期结果如下

序号名称部门入职时间等级
1小明开发部2012-101
2小红开发部2001-012
3小华开发部2021-013
4小丽账务部2013-011
5小张账务部2022-012

2、先根据部门分组,然后根据入职排序(倒序)
预期结果如下

序号名称部门入职时间等级
1小丽账务部2013-011
2小张账务部2022-012
3小明开发部2012-101
4小红开发部2001-012
5小华开发部2021-013

解决步骤

指定字段分组,组内排序和组外排序

select
	T1.*
from
	(
	select
		ID,
		DEPARTMENT,
		CREATE_TM,
		level,
		row_number() over (partition by DEPARTMENT
	order by
		level desc) as NUM
	from
		USER_INFO
	where
		DEPARTMENT is not null) T1
left join (
	select
		ROWNUM SEQ,
		DEPARTMENT
	from
		(
		select
			DEPARTMENT,
			MAX(CREATE_TM)
		from
			USER_INFO
		group by
			DEPARTMENT
		order by
			MAX(CREATE_TM))) T2 on
	T1.DEPARTMENT = T2.DEPARTMENT
order by
	T2.SEQ desc,
	T1.LEVEL asc;

说明,T1表是根据DEPARTMENT分组并按照level组内排序(正序),T2表是根据DEPARTMENT分组并按照创建时间组外排序(倒序)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛尧笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值