在Oracle中按组RANK排名

4

我有一个查询

Select age,qualification,sum(income) as total_income  from employee
group by age,qualification;

我希望能够根据年龄和资格组别的总收入排名。

例如:

19|Grad|5000|rank:1
19|Grad|4000|rank:2
19|Grad|3000|rank:3
26|Grad|6000|rank:1
26|Grad|5000|rank:2
26|PosG|8000|rank:1
26|PosG|6000|rank:2

我能在Oracle中做这个吗?我尝试使用partition by,但无法弄清楚。


你可以使用 row_number 函数。 - Mukesh Kalgude
也许使用rank()函数会更好一些...... - Giova
3个回答

7

SQL Fiddle

Oracle 11g R2 Schema Setup:

CREATE TABLE Employees ( Age, Qualification, Income ) AS
          SELECT 19, 'Grad', 5000 FROM DUAL
UNION ALL SELECT 19, 'Grad', 4000 FROM DUAL
UNION ALL SELECT 19, 'Grad', 3000 FROM DUAL
UNION ALL SELECT 26, 'Grad', 6000 FROM DUAL
UNION ALL SELECT 26, 'Grad', 5000 FROM DUAL
UNION ALL SELECT 26, 'PosG', 8000 FROM DUAL
UNION ALL SELECT 26, 'PosG', 6000 FROM DUAL;

查询1:

SELECT Age,
       Qualification,
       Income,
       RANK() OVER ( PARTITION BY Age, Qualification ORDER BY Income DESC ) AS "Rank"
FROM   Employees

Results:

| AGE | QUALIFICATION | INCOME | Rank |
|-----|---------------|--------|------|
|  19 |          Grad |   5000 |    1 |
|  19 |          Grad |   4000 |    2 |
|  19 |          Grad |   3000 |    3 |
|  26 |          Grad |   6000 |    1 |
|  26 |          Grad |   5000 |    2 |
|  26 |          PosG |   8000 |    1 |
|  26 |          PosG |   6000 |    2 |

查询2:

WITH total_incomes AS (
  SELECT Age,
         Qualification,
         SUM( Income ) AS total_income
  FROM   Employees
  GROUP BY
         Age,
         Qualification
)
SELECT Age,
       Qualification,
       total_income,
       RANK() OVER ( ORDER BY total_income DESC ) AS "Rank"
FROM   total_incomes

Results:

| AGE | QUALIFICATION | TOTAL_INCOME | Rank |
|-----|---------------|--------------|------|
|  26 |          PosG |        14000 |    1 |
|  19 |          Grad |        12000 |    2 |
|  26 |          Grad |        11000 |    3 |

0
select  age,qualification,total_income
row_number() over (partition by age,qualification order by income desc) as rank from
(
Select age,qualification,sum(income) as total_income  from employee
group by age,qualification
) T1

0
Select 
          Age,
          Qualification,
          sum(income) as totalIncome,
          dense_rank () over (order by 
                             sum(income) desc) as DRnk    from exam_RG 
    group by age,Qualification

Age Qualification   totalIncome DRnk
26  Grad            21000        1
19  Grad            12000        2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接