I have this query that produced the table below.
select season,
guildname,
count(guildname) as mp_count,
(count(guildname)/600::float)*100 as grank
from mp_rankings
group by season, guildname
order by grank desc
| season | guildname | mp_count | grank |
|---|---|---|---|
| 10 | LEGENDS | 56 | 9.33333333333333 |
| 9 | LEGENDS | 54 | 9 |
| 10 | EVERGLADE | 50 | 8.33333333333333 |
| 9 | Mystic | 46 | 7.66666666666667 |
| 10 | Mystic | 42 | 7 |
| 9 | EVERGLADE | 39 | 6.5 |
| 10 | 100 | 36 | 6 |
| 9 | PARABELLUM | 33 | 5.5 |
| 10 | PARABELLUM | 29 | 4.83333333333333 |
| 9 | 100 | 29 | 4.83333333333333 |
I wanted to create a new column that calculates the percentage difference between the two seasons using identical guildnames. For example:
| season | guildname | mp_count | grank | prev_season_percent_diff |
|---|---|---|---|---|
| 10 | LEGENDS | 56 | 9.33333333333333 | 0.33% |
| 10 | EVERGLADE | 50 | 8.33333333333333 | 1.83% |
The resulting table will only show the current season (which is the highest season value, 10 in this case) and adds a new column prev_season_percent_diff, which is the current season's grank minus the previous season's grank.
How can I achieve this?
CodePudding user response:
Use a Common Table Expression ("CTE") for the grouped result and join it to itself to calculate the difference to the previous season:
with summary as (
select
season,
guildname,
count(*) as mp_count, -- simplified equivalent expression
count(*)/6 as grank -- simplified equivalent expression
from mp_rankings
group by season, guildname
)
select
a.season,
a.guildname,
a.mp_count,
a.grank,
a.mp_count - b.mp_count as prev_season_percent_diff
from summary a
left join summary b on b.guildname = a.guildname
and b.season = a.season - 1
where a.season = (select max(season) from summary)
order by a.grank desc
If you actually want a % in the result, concatenate a % to the difference calculation.
