Oracle获取各ename最小Amount及按金额统一排名的技术问题
Oracle TEST_TABLE 需求实现方案
需求1:获取每个ename的最小Amount并按Amount排序
直接通过分组聚合实现,代码如下:
SELECT ename, MIN(Amount) AS min_amount FROM TEST_TABLE GROUP BY ename ORDER BY min_amount;
逻辑说明:用GROUP BY ename将相同姓名的行归为一组,MIN(Amount)提取每组的最小金额,最后通过ORDER BY按最小金额排序输出。
需求2:新增RANK_ID列,按Amount排序且同一ename所有行同排名
不能直接对原表的Amount字段使用DENSE_RANK(),因为同一ename可能存在不同金额,需要基于每个ename的最小金额来计算排名。以下两种方法都可以实现:
方法1:使用CTE(公共表表达式)
WITH ename_min AS ( SELECT ename, MIN(Amount) AS min_amount FROM TEST_TABLE GROUP BY ename ) SELECT t.ename, t.Amount, DENSE_RANK() OVER (ORDER BY em.min_amount) AS RANK_ID FROM TEST_TABLE t JOIN ename_min em ON t.ename = em.ename ORDER BY RANK_ID, t.ename;
方法2:使用子查询关联
SELECT t.ename, t.Amount, DENSE_RANK() OVER (ORDER BY em.min_amount) AS RANK_ID FROM TEST_TABLE t JOIN ( SELECT ename, MIN(Amount) AS min_amount FROM TEST_TABLE GROUP BY ename ) em ON t.ename = em.ename ORDER BY RANK_ID, t.ename;
逻辑说明:先通过子查询/CTE计算出每个ename对应的最小金额,再关联回原表。DENSE_RANK()函数基于每个ename的最小金额进行排序,这样同一ename的所有行都会拥有相同的排名,且排名是连续的(如果需要排名有间隔,可以替换为RANK())。
内容的提问来源于stack exchange,提问作者Mak
相关产品推荐
相关产品推荐

