Non mi è troppo chiaro cosa si voglia ottenere, però mi è chiaro il problema che hai con la query che ti avevo girato.
Quando lavori con il GROUP BY, tutte le colonne della select devono rispettare queste caratteristiche:
- Viene specificata la colonna nella clausola GROUP BY
- Il valore della colonna viene associato ad un'operazione di raggruppamento (MAX, MIN, ...)
Per cui se devi aggiungere delle colonne, o imposti il GROUP BY, oppure devi definire quale valore prendere (il più piccolo, il più grande, ...)
Una soluzione può essere quello di lavorare con la clausola WITH.
In pratica ti imposti una query che restituisce una tabella in memoria che poi vai a mettere in JOIN con quello che ti serve.
Supponiamo che nel tuo esempio, oltre alle colonne già citate, si vogliano estrarre le colonne Name e Description associate all'id.
Puoi sempre scrivere la query in questo modo:
WITH max_id_table AS (
SELECT number as number,
MAX(id) as max_id
FROM numbers
GROUP BY number
)
SELECT m.number as number,
m.max_id as max_id,
n.name as name,
n.description as description
FROM max_id_table m
JOIN numbers n ON (m.max_id = n.id)
Ovviamente la query l'ho scritta al volo e senza editor, può essere che ci sia qualche errore.
Comunque il concetto è semplice: con la clausola WITH ti crei una tabella temporanea chiamata max_id_table con le colonne che ti servono (numero + id massimo), quindi esegui una query normale usandola come una tabella fisica, potendo quindi fare anche tutte le join/where che ti servono
Ribadisco che la soluzione proposta è stata data cercando di intuire le tue necessità che non sono chiarissime. Può essere che ci siano soluzioni migliori e più performanti nella tua realtà.