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

问题描述

工作中遇到一个问题,因为我本人的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分组并按照创建时间组外排序(倒序)

posted @   薛尧笔记  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
薛尧的博客
点击右上角即可分享
微信分享提示