La falsa soluzione rownum è intelligente, ma temo che non si adatti bene (per query complesse devi unire e contare su ogni riga il numero di righe prima della riga corrente).
Prenderei in considerazione l'utilizzo di create table tmp as select /*your query*/
.perché nel caso di un'operazione di creazione come selezione, il rowid creato durante l'inserimento delle righe è esattamente quello che sarebbe il rownum (un contatore). È specificato dal documento SQLite.
Una volta inserita la query iniziale, è sufficiente interrogare la tabella tmp:
select rowid, /* your columns */ from tmp
order by rowid