OK, depois de pesquisar:
1) Ainda não existe uma função interna no postgre capaz de fazer isto (nem em qualquer outro SGDB), mas a versão 8.4 trará esta funcionalidade;
2) Portanto, não é possível realizar esta proeza com uma única instrução select;
3) É possível simular usando uma instrução como abaixo (que, por enquanto, é uma solução fornecida), mas é obrigatório o uso de uma coluna contendo a chave primária, mesmo que esta chave primária seja do tipo varchar:
Para testar, crie uma tabela e popule ela:
CREATE TABLE pessoa(
id varchar(50) PRIMARY KEY,
nome varchar(50),
idade_da_pessoa integer);
INSERT INTO pessoa(id, nome, idade_da_pessoa)
(VALUES ('0001-sp', 'Joaquim', 44),
('5977-rj', 'Pedro', 21),
('sp-tec-999', 'Mané', 53));
...em seguida, execute a instrução abaixo (que é a solução do problema):
SELECT nr_ordem, oldtable.*
FROM (SELECT * FROM pessoa) As oldtable
CROSS JOIN (SELECT ARRAY(SELECT id
FROM pessoa
ORDER BY idade_da_pessoa) As id_join) AS oldids
CROSS JOIN generate_series(1, (SELECT COUNT(*)
FROM pessoa)) AS nr_ordem
WHERE oldids.id_join[nr_ordem] = oldtable.id
ORDER BY nr_ordem;
E o resultado é este:
1 | 5977-rj | Pedro | 21
2 | 0001-sp | Joaquim | 44
3 | sp-tec-999 | Mané | 53
...resolvido o problema.
Até mais.