You can use a decode or a case statement to 'fix' the season ordering on the fly. (You don't have 'spring'?)
select time, place
from tablename
order by max(substr(time, 1, 4) || case substr(time, 5, 1)
when '2' then 1 when '3' then 2 when '1' then 3 end)
over (partition by place) desc,
place,
substr(time, 1, 4) desc,
case substr(time, 5, 1) when '2' then 1 when '3' then 2 when '1' then 3 end;
You seem to be ordering the year in descending order which your code sample didn't do, but this matches the output you wanted:
TIME PLACE
------ ---------
198422 somewhere
198431 somewhere
198410 somewhere
198320 work
198322 work
198232 home
198211 home
As you're repeating the year extraction and adjusted season calculation, you might prefer to handle those once in a subquery:
select time, place
from (
select time, place, substr(time, 1, 4) as year,
case substr(time, 5, 1) when '2' then 1 when '3' then 2 when '1' then 3 end
as season
from tablename
)
order by max(year || season) over (partition by place) desc,
place, year desc, season;