Il where da errore di sintassi perche' viene risolto PRIMA dell'elenco dei campi e quindi non puo' utilizzare cose che sono risolte dopo.

in ordine viene risolto per primo il nome tabella/e, poi le condizioni del where a seguire le definizioni dei campi e viene raccolto un result set a cui si applica il group by e le condizioni having

quindi nel tuo caso l'ordine corretto sarebbe:

select
from
where i nomi
group by nomi, ora - e' il risultato di substr(ora_da,0,2) as ora, qui puoi anche usare l'alias 'ora' ormai definito
having le ulteriori condizioni che saranno applicate solo al result set e non alla tabella intera