Oracle 19c:如何提取唯一余额及对应任意学生ID的样本数据
Oracle 19c 按唯一余额提取对应任意学生ID的解决方案
方法1:使用ROW_NUMBER()窗口函数
这是通用的实现方式,通过窗口函数按balance分组并给组内行编号,取编号为1的行即可得到每个余额对应的任意一条学生ID记录:
SELECT student_id, balance FROM ( SELECT student_id, balance, ROW_NUMBER() OVER (PARTITION BY balance ORDER BY NULL) AS rn FROM 学生余额表 ) WHERE rn = 1;
说明:ORDER BY NULL表示不指定排序规则,数据库会返回组内任意一条记录;若需要固定取某条(比如最小/最大学生ID),可将ORDER BY NULL替换为ORDER BY student_id ASC或DESC。
方法2:使用GROUP BY结合聚合函数
如果只需每个余额对应任意一个学生ID,可直接用聚合函数取组内值,写法更简洁:
SELECT MIN(student_id) AS student_id, balance FROM 学生余额表 GROUP BY balance;
说明:用MIN()会取每组中最小的学生ID,用MAX()则取最大的,均满足“任意一条”的需求,可按需选择。
方法3:使用FETCH FIRST ROW WITH TIES(Oracle 12c+支持)
借助FETCH FIRST ROW WITH TIES结合分组排序逻辑,同样能实现需求:
SELECT student_id, balance FROM 学生余额表 ORDER BY ROW_NUMBER() OVER (PARTITION BY balance ORDER BY NULL) FETCH FIRST ROW WITH TIES;
内容的提问来源于stack exchange,提问作者Khalid Waheed
相关产品推荐
相关产品推荐

