Unfortunately MySQL lack support for analytic functions. Particularly RANK()
and RANK_DENSE()
.
To emulate RANK()
you can do
SELECT pno, total_hours, rank
FROM
(
SELECT pno, total_hours,
@n := @n + 1 rnum, @r := IF(@h = total_hours, @r, @n) rank, @h := total_hours
FROM
(
SELECT pno, SUM(hours) total_hours
FROM works_on
GROUP BY pno
) q CROSS JOIN (SELECT @n := 0, @r := 0, @h := NULL) i
ORDER BY total_hours DESC, pno
) t
Sample output:
| PNO | TOTAL_HOURS | RANK |
|-----|-------------|------|
| 3 | 61 | 1 |
| 1 | 40 | 2 |
| 2 | 40 | 2 |
| 4 | 10 | 4 |
To emulate DENSE_RANK()
you can do
SELECT pno, total_hours, rank
FROM
(
SELECT pno, total_hours,
@r := IF(@h = total_hours, @r, @r + 1) rank, @h := total_hours
FROM
(
SELECT pno, SUM(hours) total_hours
FROM works_on
GROUP BY pno
) q CROSS JOIN (SELECT @r := 0, @h := NULL) i
ORDER BY total_hours DESC, pno
) t
Sample output:
| PNO | TOTAL_HOURS | RANK |
|-----|-------------|------|
| 3 | 61 | 1 |
| 1 | 40 | 2 |
| 2 | 40 | 2 |
| 4 | 10 | 3 |
Note: You can ditch outer SELECT
s if you don't mind to have one or two extra columns in your resultset.
Here is SQLFiddle demo